10

我有两个大大小小的清单。我想知道大列表中的哪些元素不在小列表中。该列表包括财产

([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")

4

3 回答 3

17

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"
于 2012-04-24T13:26:12.113 回答
5

!仅适用于逻辑向量。 B不合逻辑,这就是导致错误的原因。分解您尝试执行的步骤将向您展示这一点(即!B)。在这种情况下,您想使用%in%(或match)。

A[!A %in% B]

分解上面的代码:

  1. A %in% B创建一个逻辑向量,用于 中存在的TRUE值。AB
  2. !A %in% B否定(反转)(1)中的逻辑
  3. A[!A %in% B]TRUE返回(2)中元素的向量
于 2012-04-24T13:30:00.267 回答
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)
于 2015-09-27T23:39:29.690 回答