Zeile, die eine bestimmte Zeichenfolge enthält, mit dplyr wird gefiltert

Ich muss einen Datenrahmen filtern, indem ich als Kriterium jene Zeile verwende, in der die Zeichenfolge RTB . Ich benutze dplyr .

 d.del <- df %.% group_by(TrackingPixel) %.% summarise(MonthDelivery = as.integer(sum(Revenue))) %.% arrange(desc(MonthDelivery)) 

Ich weiß, dass ich den functionsfilter in dplyr aber ich kann nicht genau sagen, wie man den Inhalt einer Zeichenkette überprüft.

Insbesondere möchte ich den Inhalt in der Spalte TrackingPixel überprüfen. Wenn die Zeichenfolge die Bezeichnung RTB enthält, möchte ich die Zeile aus dem Ergebnis entfernen.

Solutions Collecting From Web of "Zeile, die eine bestimmte Zeichenfolge enthält, mit dplyr wird gefiltert"

Die Antwort auf die Frage wurde bereits von der @ latemail in den obigen Kommentaren gepostet. Sie können reguläre Ausdrücke für das zweite und die folgenden Argumente eines filter :

 dplyr::filter(df, !grepl("RTB",TrackingPixel)) 

Da Sie die Originaldaten nicht zur Verfügung gestellt haben, werde ich ein Spielzeugbeispiel mit dem Datensatz mtcars hinzufügen. Stellen Sie sich vor, Sie interessieren sich nur für Autos von Mazda oder Toyota.

 mtcars$type < - rownames(mtcars) dplyr::filter(mtcars, grepl('Toyota|Mazda', type)) mpg cyl disp hp drat wt qsec vs am gear carb type 1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 Mazda RX4 2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 Mazda RX4 Wag 3 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 Toyota Corolla 4 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 Toyota Corona 

Wenn Sie es andersherum machen möchten, nämlich Toyota und Mazda Autos ausschließen, sieht der filter aus:

 dplyr::filter(mtcars, !grepl('Toyota|Mazda', type)) 

Lösung

Es ist möglich, str_detect des stringr Pakets zu verwenden, das im Paket ” tidyverse enthalten ist. str_detect gibt True oder False , ob der angegebene Vektor eine bestimmte Zeichenfolge enthält. Es ist möglich, mit diesem booleschen Wert zu filtern. Weitere Informationen zum stringr Paket finden Sie unter Einführung in stringr .

 library(tidyverse) # ─ Attaching packages ──────────────────── tidyverse 1.2.1 ─ # ✔ ggplot2 2.2.1 ✔ purrr 0.2.4 # ✔ tibble 1.4.2 ✔ dplyr 0.7.4 # ✔ tidyr 0.7.2 ✔ stringr 1.2.0 # ✔ readr 1.1.1 ✔ forcats 0.3.0 # ─ Conflicts ───────────────────── tidyverse_conflicts() ─ # ✖ dplyr::filter() masks stats::filter() # ✖ dplyr::lag() masks stats::lag() mtcars$type < - rownames(mtcars) mtcars %>% filter(str_detect(type, 'Toyota|Mazda')) # mpg cyl disp hp drat wt qsec vs am gear carb type # 1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 Mazda RX4 # 2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 Mazda RX4 Wag # 3 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 Toyota Corolla # 4 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 Toyota Corona 

Die guten Dinge über Stringr

Wir sollten eher stringr::str_detect() als base::grepl() . Dies liegt daran, dass es die folgenden Gründe gibt.

  • Die vom stringr Paket bereitgestellten functionen beginnen mit dem Präfix str_ , wodurch der Code leichter zu lesen ist.
  • Das erste Argument der functionen von stringr Paket ist immer der data.frame (oder Wert), dann kommen die Parameter. (Danke Paolo)
 object < - "stringr" # The functions with the same prefix `str_`. # The first argument is an object. stringr::str_count(object) # -> 7 stringr::str_sub(object, 1, 3) # -> "str" stringr::str_detect(object, "str") # -> TRUE stringr::str_replace(object, "str", "") # -> "ingr" # The function names without common points. # The position of the argument of the object also does not match. base::nchar(object) # -> 7 base::substr(object, 1, 3) # -> "str" base::grepl("str", object) # -> TRUE base::sub("str", "", object) # -> "ingr" 

Benchmark

Die Ergebnisse des Benchmark-Tests sind wie folgt. Für große Daten ist str_detect schneller.

 library(rbenchmark) library(tidyverse) # The data. Data expo 09. ASA Statistics Computing and Graphics # http://stat-computing.org/dataexpo/2009/the-data.html df < - read_csv("Downloads/2008.csv") print(dim(df)) # [1] 7009728 29 benchmark( "str_detect" = {df %>% filter(str_detect(Dest, 'MCO|BWI'))}, "grepl" = {df %>% filter(grepl('MCO|BWI', Dest))}, replications = 10, columns = c("test", "replications", "elapsed", "relative", "user.self", "sys.self")) # test replications elapsed relative user.self sys.self # 2 grepl 10 16.480 1.513 16.195 0.248 # 1 str_detect 10 10.891 1.000 9.594 1.281 

Diese Antwort ist ähnlich wie bei anderen, aber unter Verwendung von str_detect und dplyr rownames_to_column .

 library(tidyverse) mtcars %>% rownames_to_column("type") %>% filter(str_detect(type, 'Toyota|Mazda') ) #> type mpg cyl disp hp drat wt qsec vs am gear carb #> 1 Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 #> 2 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 #> 3 Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 #> 4 Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 

Erstellt am 2018-06-26 mit dem Paket represx (v0.2.0).

Wenn Sie die Zeichenfolge in einer bestimmten Spalte finden möchten, casting Sie einen Blick auf

Zeile entfernen, wenn eine Spalte eine bestimmte Zeichenfolge enthält

Es geht im Grunde um filter_at oder filter_all