7

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

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

我怎么能使用一个通用函数来只保留那些不包含PATTERN的向量中的元素?

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

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

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

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

4

1 回答 1

9

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

这里有两个正确的解决方案:

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表示返回匹配的值。

于 2013-07-07T11:57:27.313 回答