基于正则表达式模式从向量中排除元素

时间:2013-07-07 11:00:21

标签: regex r

我想要使用R中的正则表达式清理一些数据。

很容易找到如何获取包含某些模式的元素,或者不包含某些单词(字符串),但我无法找到如何排除包含模式的单元格。

如何使用常规函数仅保留不包含 PATTERN 的向量中的元素?

我不想举一个例子,因为这可能会导致人们使用其他(虽然通常很好)的方式回答而不是预期的方式:基于正则表达式排除。无论如何这里都是:

如何排除包含以下任何字符的所有元素: 'pyfgcrl

vector <- c("Cecilia", "Cecily", "Cecily's", "Cedric", "Cedric's", "Celebes", 
            "Celebes's", "Celeste", "Celeste's", "Celia", "Celia's", "Celina")

在这种情况下,结果将是一个空矢量。

1 个答案:

答案 0 :(得分:6)

编辑:从评论中,经过一些测试,我会发现我的建议不正确。

以下是两个正确的解决方案:

vector[!grepl("['pyfgcrl]", vector)]                    ## kohske
grep("['pyfgcrl]", vector, value = TRUE, invert = TRUE) ## flodel

如果他们中的任何一个想重新发帖并接受他们的回答,我很乐意在这里删除我的。


解释

您正在寻找的常规功能是grepl。来自grepl的帮助文件:

  

grepl返回逻辑向量(对于x的每个元素是否匹配。)

此外,您应该阅读regex的帮助页面,其中介绍了字符类。在这种情况下,您创建一个字符类['pyfgcrl],它表示要查找方括号中的任何字符。然后,您可以使用!否定此内容。

所以,到目前为止,我们有一些看起来像:

!grepl("['pyfgcrl]", vector)

为了得到你想要的东西,你像往常一样进行分组。

vector[!grepl("['pyfgcrl]", vector)]

对于@flodel提供的第二个解决方案,grep默认返回匹配的位置value = TRUE参数允许您返回实际的字符串价值而不是。 invert = TRUE表示返回匹配的值。