从向量中删除向量元素
这看起来很容易,但我一直在撞头。
我有数字向量 v1
v1 <- c(1,1,3,5,7,7)
我有一个数字向量 v2。v2 始终是 v1 的子集。
我想从 v1 中删除 v2 中的所有元素,但 每个 v2 元素只有一个(并且精确到一个)v1 元素。
期望的输出
如果v2 <- c(3,5)我想c(1,1,7,7)避免 v1. 这个很容易使用v1[-match(v2, v1)]。
如果v2 <- c(1,7)我想c(1,3,5,7)避免 v1. 也,v1[-match(v2, v1)]有诀窍。
如果v2 <- c(1,1)我想c(3,5,7,7)避免 v1. 现在v1[-match(v2, v1)]返回[1] 1 3 5 7 7.. 不是我想要的。
回答
您可以通过以下方式使用vsetdiff“vecsets”库(这将保留重复项而不是setdiff):
library(vecsets)
v1 <- c(1,1,3,5,7,7)
v2.1 <- c(3,5)
> vsetdiff(v1, v2.1)
[1] 1 1 7 7
v2.2 <- c(1,7)
> vsetdiff(v1, v2.2)
[1] 1 3 5 7
v2.3 <- c(1,1)
> vsetdiff(v1, v2.3)
[1] 3 5 7 7
回答
Reduce(function(x, y) x[-match(y, x)], v2, init = v1)