从向量中删除向量元素

时间:2021-03-30 14:34:33

标签: r

这看起来很容易,但我一直在撞头。

我有数字向量 v1

v1 <- c(1,1,3,5,7,7)

我有一个数字向量 v2。 v2 始终是 v1 的子集
我想从 v1 中删除 v2 中的所有元素,但每个 v2 元素只有 一个(和唯一一个)v1 元素。

期望输出

如果 v2 <- c(3,5) 我想保留 v1 中的 c(1,1,7,7)。这很容易使用 v1[-match(v2, v1)]
如果 v2 <- c(1,7) 我想保留 v1 中的 c(1,3,5,7)。此外,v1[-match(v2, v1)] 也能解决问题。
如果 v2 <- c(1,1) 我想保留 v1 中的 c(3,5,7,7)。现在 v1[-match(v2, v1)] 返回 [1] 1 3 5 7 7 .. 不是我想要的。

4 个答案:

答案 0 :(得分:8)

您可以通过以下方式使用“vecsets”库中的 vsetdiff(这将保留重复项而不是 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

答案 1 :(得分:4)

Reduce(function(x, y) x[-match(y, x)], v2, init = v1)

答案 2 :(得分:3)

使用真正的递归函数可能有更好的方法,但我认为您可以使用 for 循环来实现:

v1 <- c(1, 1, 3, 5, 7, 7)
v2 <- c(1,1)
v1_keep <- v1

for (i in seq_along(v2)){
  v1_keep <- v1_keep[-match(v2[i], v1_keep)]
}

v1_keep
# [1] 3 5 7 7

答案 3 :(得分:1)

使用 map2

library(purrr)
map2(v1, v2, setdiff) %>% 
     flatten
相关问题