假设我有三个向量,我想比较它们以查看每个向量的元素不在其他向量中,首先要与“c”进行比较。
a<-c(1,2,7,8)
b<-c(1,2,3,4)
c<-c(3,4,5,6)
所以这就像我期望的那样工作(1 和 2 在“b”中,但不在“c”中)
b[-which(b%in%c)]
返回:
[1] 1 2
但这并没有告诉我哪个“a”不在“c”中(全部,即 1,2,7,8),而是给了我一个没有任何内容的数字向量。
a[-which(a%in%c)]
返回:
integer(0)
看起来像 this answer最终会做我想做的事,但是我对 which
和 %in%
的使用方式有什么误解?更好的是,我如何得到答案
[1] 1 2 7 8
当没有一个“a”在“c”中时,哪个“a”不在“c”中?
最佳答案
使用逻辑运算更可靠:
b[!b %in% c]
# [1] 1 2
a[!a %in% c]
# [1] 1 2 7 8
请注意,!a %in% c
与 !(a %in% c)
相同。这样我们问a
中的哪一个在c
中,得到一个逻辑结果,取反。另一方面,使用 which
的工作方式不同:在 -which(a %in% c)
中,我们还首先得到一个逻辑向量 a %in% c
然后 which
给出 a
中属于 c
的元素的 indices,然后摆脱那些元素。在你的情况下,我们有
which(a %in% c)
# integer(0)
那么你可能会争辩说 a[-numeric(0)]
也应该返回
# [1] 1 2 7 8
但在 R 中不是这样。
关于r - 当向量的项不匹配时使用 which 和 %in%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53834767/