Fila de filtrado que contiene una cierta cadena usando dplyr

Tengo que filtrar un dataframe usando como criterio esa fila en la que está contenida la cadena RTB . Estoy usando dplyr .

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

Sé que puedo usar el filter función en dplyr pero no sé exactamente cómo decirle que verifique el contenido de una cadena.

En particular, quiero verificar el contenido en la columna TrackingPixel . Si la cadena contiene la etiqueta RTB , quiero eliminar la fila del resultado.

La respuesta a la pregunta ya fue publicada por @latemail en los comentarios anteriores. Puede usar expresiones regulares para el segundo y siguientes argumentos de filter como este:

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

Como no ha proporcionado los datos originales, mtcars un ejemplo de juguete usando el mtcars datos mtcars . Imagine que solo le interesan los autos producidos por Mazda o 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 

Si desea hacerlo al revés, es decir, excluyendo los autos Toyota y Mazda, el comando de filter ve así:

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

Solución

Es posible usar str_detect del paquete stringr incluido en el paquete tidyverse . str_detect devuelve True o False cuanto a si el vector especificado contiene alguna cadena específica. Es posible filtrar usando este valor booleano. Consulte Introducción a stringr para obtener más información sobre el paquete 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 

Lo bueno de Stringr

Deberíamos usar más bien stringr::str_detect() que base::grepl() . Esto es porque hay las siguientes razones.

  • Las funciones proporcionadas por el paquete stringr comienzan con el prefijo str_ , lo que hace que el código sea más fácil de leer.
  • El primer argumento de las funciones del paquete stringr es siempre el data.frame (o value), luego vienen los parámetros. (Gracias 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" 

Punto de referencia

Los resultados de la prueba comparativa son los siguientes. Para datos grandes, str_detect es más rápido.

 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 

Esta respuesta es similar a otras, pero utilizando str_detect preferido y 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 

Creado en 2018-06-26 por el paquete reprex (v0.2.0).

Si desea encontrar la cadena en una columna dada , eche un vistazo a

Eliminar fila si alguna columna contiene una cadena específica

Básicamente se trata de usar filter_at o filter_all