我正在尝试使用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
我想:
我已经设法弄清楚如何摆脱包含&#39; x&#39;或者&#39; xx&#39;,但不是以开头或结尾。以下是如何摆脱&#39; xx&#39;里面(不仅仅是结束):
df1 %>% filter(!grepl("xx",fruit))
# fruit group
#1 apple A
#2 orange B
#3 xapple A
#4 xorange B
#5 banxana A
这显然是错误的&#39; (从我的角度来看)过滤了“appxxle&#39;。
”我从来没有完全掌握正则表达式。我一直在尝试修改代码,例如:grepl("^(?!x).*$", df1$fruit, perl = TRUE)
以尝试使其在过滤器命令中工作,但我不太明白。
预期产出:
# fruit group
#1 apple A
#2 orange B
#3 banxana A
#4 appxxle B
如果可能,我想在dplyr
内执行此操作。
答案 0 :(得分:38)
我不了解你的第二个正则表达式,但这个更基本的正则表达式似乎可以解决这个问题:
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
否定了!
的结果,因此我们找到的字符串与正则表达式中的字符串不匹配。