简体   繁体   English

从向量中删除向量元素

[英]remove vector-elements from vector

This looks easy enough, but I keep bumping my head.这看起来很容易,但我一直在撞我的头。

I have the numeric vector v1我有数字向量v1

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

And I have a numeric vector v2.我有一个数字向量 v2。 v2 is always a subset of v1 . v2 始终是 v1 的子集
I want to remove the all elements from v2 from v1, but only one (and exaclty one) v1 element per v2 element.我想从 v1 中删除 v2 中的所有元素,但每个 v2 元素只有一个(和确切的一个)v1 元素。

desired output所需 output

if v2 <- c(3,5) I want to keep c(1,1,7,7) from v1.如果v2 <- c(3,5)我想保留 v1 中的c(1,1,7,7) This one is easy using v1[-match(v2, v1)] .这很容易使用v1[-match(v2, v1)]
if v2 <- c(1,7) I want to keep c(1,3,5,7) from v1.如果v2 <- c(1,7)我想保留 v1 中的c(1,3,5,7) also, v1[-match(v2, v1)] does the trick.此外, v1[-match(v2, v1)]可以解决问题。
if v2 <- c(1,1) I want to keep c(3,5,7,7) from v1.如果v2 <- c(1,1)我想保留 v1 中的c(3,5,7,7) Now v1[-match(v2, v1)] returns [1] 1 3 5 7 7 .. Not what I want.现在v1[-match(v2, v1)]返回[1] 1 3 5 7 7 .. 不是我想要的。

You can use vsetdiff from the "vecsets" library (this will keep the duplicates as opposed to setdiff ), in the following way:您可以使用“ vsetdiff ”库中的 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
Reduce(function(x, y) x[-match(y, x)], v2, init = v1)

There's probably a better way using a truly recursive function, but I think you could accomplish this with a for loop:使用真正递归的 function 可能有更好的方法,但我认为您可以使用 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

Using map2使用map2

library(purrr)
map2(v1, v2, setdiff) %>% 
     flatten

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM