我有两个大小的名单。我想知道大列表中的哪些元素不在较小的列表中。该列表由属性
组成([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”)
答案 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]
分解上述代码:
A %in% B
为TRUE
的值创建A
的逻辑向量
存在于B
。!A %in% B
否定(逆转)(1)A[!A %in% B]
返回(2)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)