在大列表中查找不在较小字符向量列表中的元素

12
  • 我有两个列表,一个大的列表和一个小的列表。我想知道在大的列表中哪些元素不在小的列表中。这两个列表都由属性组成。
([1] "character"           "vector"              "data.frameRowLabels"
[4] "SuperClassMethod"

这是一个简单的示例以及我遇到的错误

 A <- c("A", "B", "C", "D")
 B <- c("A", "B", "C")
  new <- A[!B]
Error in !B : invalid argument type

预期输出为 new <- c("D")

3个回答

18

看一下help("%in%")——在该页面的最底部有一个例子可以解决这种情况。


A <- c("A", "B", "C", "D")
B <- c("A", "B", "C")
(new <- A[which(!A %in% B)])

# [1] "D"

编辑:

正如Tyler所指出的那样,我应该听从自己的建议并阅读支持文件。在这个例子中使用%in%时,which()是不必要的。所以,

(new <- A[!A %in% B])

# [1] "D"

这里不需要“the”。 - Tyler Rinker
@Tyler,你说得对;我应该听从自己的建议:来自help("%in%")的内容:“%in%从不返回NA,在if条件中特别有用”。我出于习惯包含了which,因为我曾经在没有它的情况下受过伤。在这里,它是不必要的。 - BenBarnes

6

! 只能用于逻辑向量。 B 不是逻辑型,这就导致了错误。分解你尝试进行的步骤将会显示这一点(即 !B)。在这种情况下,您应该使用 %in%(或 match)。

A[!A %in% B]

解析上面的代码:

  1. A %in% B 创建一个逻辑向量,其中对于 B 中存在的 A 的值为 TRUE
  2. !A %in% B 反转 (1) 中的逻辑。
  3. A[!A %in% B] 返回在 (2) 中为 TRUE 的元素向量。

4

我认为集合可以帮助你处理不同的列表。

在你的情况下,你可以直接使用:

A <- c("A", "B", "C", "D")
B <- c("A", "B", "C")

# to find difference
setdiff(A, B)

# to find intersect
intersect(A, B)

# to find union
union(A, B)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接