结合 grepl 过滤 dplyr 中的观察结果

Posted

技术标签:

【中文标题】结合 grepl 过滤 dplyr 中的观察结果【英文标题】:Filtering observations in dplyr in combination with grepl 【发布时间】:2014-11-17 22:03:32 【问题描述】:

我正在尝试研究如何使用 dplyrgrepl 从大型数据集中过滤一些观察结果。我不喜欢grepl,如果其他解决方案会更理想。

拿这个样本df:

df1 <- data.frame(fruit=c("apple", "orange", "xapple", "xorange", 
                          "applexx", "orangexx", "banxana", "appxxle"), group=c("A", "B") )
df1


#     fruit group
#1    apple     A
#2   orange     B
#3   xapple     A
#4  xorange     B
#5  applexx     A
#6 orangexx     B
#7  banxana     A
#8  appxxle     B

我想:

    过滤掉以“x”开头的情况 过滤掉那些以“xx”结尾的情况

我已经设法摆脱所有包含“x”或“xx”的东西,但不是以开头或结尾。以下是如何摆脱内部带有“xx”的所有内容(不仅仅是以结尾):

df1 %>%  filter(!grepl("xx",fruit))

#    fruit group
#1   apple     A
#2  orange     B
#3  xapple     A
#4 xorange     B
#5 banxana     A

这显然是“错误地”(在我看来)过滤了“appxxle”。

我从来没有完全掌握正则表达式。我一直在尝试修改代码,例如:grepl("^(?!x).*$", df1$fruit, perl = TRUE) 以尝试使其在 filter 命令中工作,但我不太明白。

预期输出:

#      fruit group
#1     apple     A
#2    orange     B
#3   banxana     A
#4   appxxle     B

如果可能的话,我想在dplyr 内执行此操作。

【问题讨论】:

【参考方案1】:

我不明白你的第二个正则表达式,但这个更基本的正则表达式似乎可以解决问题:

df1 %>% filter(!grepl("^x|xx$", fruit))
###
    fruit group
1   apple     A
2  orange     B
3 banxana     A
4 appxxle     B

我假设你知道这一点,但你根本不必在这里使用dplyr

df1[!grepl("^x|xx$", df1$fruit), ]
###
    fruit group
1   apple     A
2  orange     B
7 banxana     A
8 appxxle     B

正则表达式正在寻找以x 开头或以xx 结尾的字符串。 ^$ 分别是字符串开头和结尾的正则表达式锚。 | 是 OR 运算符。我们用! 否定了grepl 的结果,所以我们发现的字符串与正则表达式中的内容不匹配。

【讨论】:

很好的解决方案!我在使用 6M+ 数据集时遇到了类似的问题,并注意到 dplyr 解决方案的运行速度快得多。干杯。 @GabrielReis - 可能是在 2020 年......在 2014 年最初回答时,dplyr 并不总是那么迅速。 哈哈有趣!

以上是关于结合 grepl 过滤 dplyr 中的观察结果的主要内容,如果未能解决你的问题,请参考以下文章

根据列R / dplyr中的“复杂”字符串过滤行

grepl 用于 dplyr sql 表?

dplyr 使用过滤器选择观察值

如何使用 sparklyr 过滤部分匹配

R Shiny Reactive 值,dplyr 过滤器错误?

如何使用 for 循环过滤熊猫数据框中的观察结果?