seleccionar - filtrar datos en r
Fila de filtrado que contiene una cierta cadena usando dplyr (3)
Tengo que filtrar un marco de datos 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))
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
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 prefijostr_
, 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