结合 grepl 过滤 dplyr 中的观察结果
Posted
技术标签:
【中文标题】结合 grepl 过滤 dplyr 中的观察结果【英文标题】:Filtering observations in dplyr in combination with grepl 【发布时间】:2014-11-17 22:03:32 【问题描述】:我正在尝试研究如何使用 dplyr
和 grepl
从大型数据集中过滤一些观察结果。我不喜欢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 中的观察结果的主要内容,如果未能解决你的问题,请参考以下文章