繁体   English   中英

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

[英]R: Delete element from multiple vectors if only present in a few vectors

如果多个矢量中仅包含几个元素,该如何删除它们。 例如,如果我有以下两个向量

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

然后我尝试使用grep删除所有带有'A'的元素:

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

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

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

如何更改代码,使其适用于所有矢量?

提前致谢,

保罗

您可以使用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"

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

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

也就是说,它在Text2找不到'A'。 因此,您的Text2[-integer(0)]将不会返回任何内容

您可以使用grepl来测试字符是否存在(或在这种情况下不使用!

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

在此,如果字符/样式匹配,则grepl返回逻辑值。 在此示例中,对于Text2 ,在任何一个元素中均未找到“ A”

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

因此,现在我们可以“取反”它,并对原始向量进行子集化,这与进行Text2[!c(FALSE, FALSE)]

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM