1

我想这是一个非常简单的问题。

v1 = 1:10
v2 = c(2,4,7)

(没有一个数字重复。无需使用unique()

我想要一个包含 v1 中所有不在 v2 中的值的向量。

solution = c(1,3,5,6,8,9,10)

我可以使用 for 循环来做到这一点,但我确信有更简单的解决方案。

4

2 回答 2

8
setdiff(v1, v2)
# [1]  1  3  5  6  8  9 10
于 2013-04-30T11:03:21.823 回答
4

使用%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 向量化的完美示例。由于其副作用和/或当处理与迭代次数的比率很大时,最好调用循环。

于 2013-04-30T10:59:44.977 回答