R:如果仅存在于几个向量中,则从多个向量中删除元素

时间:2016-12-21 10:17:31

标签: r vector grep

如果元素仅存在于几个向量中,如何从多个向量中删除元素。 例如,如果我有以下2个向量

> Text <- c("AB.txt", "B.txt", "C.txt")
> Text2 <- c("B.txt", "C.txt")

然后我尝试用&#39; A&#39;删除所有元素。使用grep:

> Text[-grep( “A”, Text)]
[1] "B.txt" "C.txt"

然而,当我在Text2上执行此操作时,所有元素都会在网络空间中消失。

> Text2[-grep( “A”, Text2)]
character(0)

如何更改代码以使其适用于所有向量?

提前致谢,

3 个答案:

答案 0 :(得分:2)

您可以使用invert参数:

Text[grep("A", Text, fixed = TRUE, invert = TRUE)]
#[1] "B.txt" "C.txt"
Text2[grep("A", Text2, fixed = TRUE, invert = TRUE)]
#[1] "B.txt" "C.txt"

答案 1 :(得分:2)

如果你看一下grep("A", Text2)实际返回的内容:

grep("A", Text2)
# integer(0)

也就是说,它无法找到“A&#39;在Text2。因此,Text2[-integer(0)]不会返回任何内容

您可以使用grepl来测试角色是否存在(或者在这种情况下不存在,使用!

Text[!grepl("A", Text)]
# [1] "B.txt" "C.txt"
Text2[!grepl("A", Text2)]
# [1] "B.txt" "C.txt"

此处,如果字符/模式匹配,grepl将返回逻辑值。在Text2的示例中,&#39; A&#39;在任何一个元素中都找不到

grepl("A", Text2)
# [1] FALSE FALSE

所以现在我们可以否定&#39;这个,并且是原始向量的子集,与向Text2[!c(FALSE, FALSE)]

相同

答案 2 :(得分:0)

一种选择是确定我们想要保留的Text2中的索引。这是 not 出现在grep输出中的所有索引。

Text2[!c(1:length(Text2)) %in% grep("A", Text2)]