我必须使用包含字符串RTB
的行作为标准来过滤数据帧。
我正在使用dplyr
。
d.del <- df %.%
group_by(TrackingPixel) %.%
summarise(MonthDelivery = as.integer(sum(Revenue))) %.%
arrange(desc(MonthDelivery))
我知道我可以在filter
中使用函数dplyr
,但我并不确切地告诉它如何检查字符串的内容。
特别要检查TrackingPixel
列中的内容。如果字符串包含标签RTB
,我想从结果中删除该行。
答案 0 :(得分:201)
@latemail在上面的评论中已经发布了问题的答案。您可以对filter
的第二个和后续参数使用正则表达式,如下所示:
dplyr::filter(df, !grepl("RTB",TrackingPixel))
由于您尚未提供原始数据,我将使用mtcars
数据集添加玩具示例。想象一下,你只对马自达或丰田生产的汽车感兴趣。
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
如果你想反过来做,即不包括丰田汽车和马自达汽车,filter
命令如下:
dplyr::filter(mtcars, !grepl('Toyota|Mazda', type))
答案 1 :(得分:99)
<强> 解决方案 强>
可以使用str_detect
包中包含的stringr
包的tidyverse
。 str_detect
返回True
或False
,以确定指定的向量是否包含某些特定字符串。可以使用此布尔值进行过滤。有关stringr
包的详细信息,请参阅Introduction to 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
关于Stringr的好消息
我们应该使用stringr::str_detect()
而不是base::grepl()
。这是因为有以下原因。
stringr
包提供的功能以前缀str_
开头,使代码更易于阅读。stringr
包函数的第一个参数始终是data.frame(或value),然后是参数。(谢谢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"
<强> 基准 强>
基准测试的结果如下。对于大型数据框,str_detect
更快。
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
答案 2 :(得分:9)
此答案与其他答案相似,但使用首选的stringr::str_detect
和dplyr rownames_to_column
。
library(tidyverse)
mtcars %>%
rownames_to_column("type") %>%
filter(stringr::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
由reprex package(v0.2.0)于2018-06-26创建。
答案 3 :(得分:0)