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

时间:2012-04-24 13:18:23

标签: r list character subset

我有两个大小的名单。我想知道大列表中的哪些元素不在较小的列表中。该列表由属性

组成
([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

预期输出为新&lt; -c(“D”)

3 个答案:

答案 0 :(得分:11)

查看help("%in%") - 该页面底部的示例已经解决了这种情况。

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

# [1] "D"

修改

正如泰勒指出的那样,我应该听取自己的建议并阅读支持文件。在此示例中使用which()时,不需要%in%。所以,

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

# [1] "D"

答案 1 :(得分:5)

!仅适用于逻辑向量。 B不合逻辑,这是导致错误的原因。分解您尝试制作的步骤将显示此信息(即!B)。在这种情况下,您希望使用%in%(或match)。

A[!A %in% B]

分解上述代码:

  1. A %in% BTRUE的值创建A的逻辑向量 存在于B
  2. !A %in% B否定(逆转)(1)
  3. 中的逻辑
  4. A[!A %in% B]返回(2)
  5. TRUE元素的向量

答案 2 :(得分:3)

虽然我认为sets可以帮助您处理不同的列表。

在您的情况下,您可以使用:

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)