解决方案
可以使用包含在tidyverse
包中的stringr
包的str_detect
函数。 str_detect
函数返回一个布尔值,指示指定的向量是否包含某个特定字符串。 可以使用此布尔值进行过滤。有关stringr
包的详细信息,请参见Introduction to stringr。
library(tidyverse)
mtcars$type <- rownames(mtcars)
mtcars %>%
filter(str_detect(type, 'Toyota|Mazda'))
关于Stringr的好处
我们应该使用stringr::str_detect()
而不是base::grepl()
。原因如下:
stringr
软件包提供的函数以前缀str_
开头,使代码更易读。
stringr
软件包函数的第一个参数始终是数据框(或值),其次是参数。(感谢Paolo)
object <- "stringr"
stringr::str_count(object)
stringr::str_sub(object, 1, 3)
stringr::str_detect(object, "str")
stringr::str_replace(object, "str", "")
base::nchar(object)
base::substr(object, 1, 3)
base::grepl("str", object)
base::sub("str", "", object)
基准测试
基准测试结果如下。对于大型数据框,str_detect
更快。
library(rbenchmark)
library(tidyverse)
df <- read_csv("Downloads/2008.csv")
print(dim(df))
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"))
dplyr
,但查看了?dplyr::filter
的帮助文档后,我建议尝试使用类似以下代码:filter(df, !grepl("RTB", TrackingPixel))
。 - thelatemailgrepl
前面添加!
来撤销它 - 再试一次。 - thelatemailgrep
的invert
和value
参数。正则表达式使得处理文本变得轻松许多。 - Rich Scrivengrepl
在我的Postgres上无法正常工作,这是针对MySQL的吗? - Statwonk