我想这是一个非常简单的问题。
v1 = 1:10
v2 = c(2,4,7)
(没有一个数字重复。无需使用unique()
)
我想要一个包含 v1 中所有不在 v2 中的值的向量。
solution = c(1,3,5,6,8,9,10)
我可以使用 for 循环来做到这一点,但我确信有更简单的解决方案。
setdiff(v1, v2)
# [1] 1 3 5 6 8 9 10
使用%in%
带逻辑 NOT ( !
)的运算符v1
按不在 中的值进行子集化v2
:
v1[ ! v1 %in% v2 ]
#[1] 1 3 5 6 8 9 10
或者您可以在 v2 中查找不匹配的 v1(这几乎相同):
v1[ is.na( match( v1 , v2 ) ) ]
#[1] 1 3 5 6 8 9 10
或which
用于获取索引:
v1[ which( ! v1 %in% v2 ) ]
#[1] 1 3 5 6 8 9 10
所有的味道都是一样的。还有更多方法可以做到这一点。绝对不要为此使用循环,因为这种操作是如何利用 R 向量化的完美示例。由于其副作用和/或当处理与迭代次数的比率很大时,最好调用循环。