Tengo que filtrar un marco de datos utilizando como criterio aquellas filas en las 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 utilizar la función filter
de dplyr
pero no exactamente cómo contarla para comprobar 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.
dplyr
, pero mirando la ayuda en?dplyr::filter
sugeriría algo comofilter(df, !grepl("RTB",TrackingPixel))
¿quizás?RTB
y no mostrar las demás.!
frente degrepl
- inténtalo de nuevo.invert
yvalue
degrep
. Las expresiones regulares hacen que trabajar con texto sea mil veces más fácil.grepl
no funciona en postgres para mí, ¿es esto para MySQL?Respuestas:
La respuesta a la pregunta ya fue publicada por @latemail en los comentarios anteriores. Puede usar expresiones regulares para el segundo argumento y los siguientes de
filter
este modo:Como no ha proporcionado los datos originales, agregaré un ejemplo de juguete utilizando el
mtcars
conjunto de datos. Imagine que solo le interesan los automóviles producidos por Mazda o Toyota.Si desea hacerlo al revés, es decir, excluyendo los automóviles Toyota y Mazda, el
filter
comando se ve así:fuente
mtcars$`my type` <- rownames(mtcars)
y luegomtcars %>% filter(grepl('Toyota|Mazda', `my type`))
tbl_sql
yagrepl
que no se traduce a sql.Solución
Es posible utilizar
str_detect
elstringr
paquete incluido en eltidyverse
paquete.str_detect
devuelveTrue
oFalse
si el vector especificado contiene alguna cadena específica. Es posible filtrar usando este valor booleano. Vea Introducción a stringr para obtener detalles sobre elstringr
paqueteLo bueno de Stringr
Deberíamos usar en lugar
stringr::str_detect()
debase::grepl()
. Esto se debe a que existen las siguientes razones.stringr
paquete comienzan con el prefijostr_
, lo que hace que el código sea más fácil de leer.stringr
paquete es siempre el data.frame (o valor), luego vienen los parámetros. (Gracias Paolo)Punto de referencia
Los resultados de la prueba de referencia son los siguientes. Para grandes marcos de datos,
str_detect
es más rápido.fuente
stringr
paquete comienzan con el prefijo str_, que hace que el código sea más fácil de leer. En el código R moderno reciente, se recomienda usar stringr.base R
es tan bueno comostringr
. Si nos proporcionara algunos "hechos concretos" como la evaluación comparativa, y no solo declarar "se recomienda" (¿Quién lo recomienda?), Esto sería muy apreciado. GraciasEsta respuesta es similar a otras, pero con preferencia
stringr::str_detect
y dplyrrownames_to_column
.Creado el 26-06-2018 por el paquete reprex (v0.2.0).
fuente
str_detect
está en elstringr
paqueteeditar incluye la
across()
sintaxis más nuevaAquí hay otra
tidyverse
solución, usandofilter(across())
o previamentefilter_at
. La ventaja es que puede extenderse fácilmente a más de una columna .A continuación también una solución
filter_all
para encontrar la cadena en cualquier columna, usandodiamonds
como ejemplo, buscando la cadena "V"Cadena en una sola columna
La sintaxis ahora reemplazada para la misma sería:
Cadena en todas las columnas:
La sintaxis ahora reemplazada para la misma sería:
Traté de encontrar una alternativa cruzada para lo siguiente, pero no encontré inmediatamente una buena solución:
Actualización: Gracias al usuario Petr Kajzar en esta respuesta , aquí también un enfoque para lo anterior:
fuente