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

时间:2014-09-23 15:51:17

标签: r filter dplyr grepl

我正在尝试使用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

我想:

  1. 过滤掉以&#39; x&#39;
  2. 开头的情况
  3. 过滤掉那些以&#39; xx&#39;
  4. 结尾的案例

    我已经设法弄清楚如何摆脱包含&#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内执行此操作。

1 个答案:

答案 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否定了!的结果,因此我们找到的字符串与正则表达式中的字符串不匹配。