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 filterde dplyrpero 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::filtersugeriría algo comofilter(df, !grepl("RTB",TrackingPixel))¿quizás?RTBy no mostrar las demás.!frente degrepl- inténtalo de nuevo.invertyvaluedegrep. Las expresiones regulares hacen que trabajar con texto sea mil veces más fácil.greplno 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
filtereste modo:Como no ha proporcionado los datos originales, agregaré un ejemplo de juguete utilizando el
mtcarsconjunto 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
filtercomando se ve así:fuente
mtcars$`my type` <- rownames(mtcars)y luegomtcars %>% filter(grepl('Toyota|Mazda', `my type`))tbl_sqlyagreplque no se traduce a sql.Solución
Es posible utilizar
str_detectelstringrpaquete incluido en eltidyversepaquete.str_detectdevuelveTrueoFalsesi el vector especificado contiene alguna cadena específica. Es posible filtrar usando este valor booleano. Vea Introducción a stringr para obtener detalles sobre elstringrpaqueteLo bueno de Stringr
Deberíamos usar en lugar
stringr::str_detect()debase::grepl(). Esto se debe a que existen las siguientes razones.stringrpaquete comienzan con el prefijostr_, lo que hace que el código sea más fácil de leer.stringrpaquete 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_detectes más rápido.fuente
stringrpaquete 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 Res 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_detecty dplyrrownames_to_column.Creado el 26-06-2018 por el paquete reprex (v0.2.0).
fuente
str_detectestá en elstringrpaqueteeditar incluye la
across()sintaxis más nuevaAquí hay otra
tidyversesolució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_allpara encontrar la cadena en cualquier columna, usandodiamondscomo 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