从另一个向量中删除向量中第一次出现的元素

时间:2015-05-08 17:37:17

标签: r duplicates

我有一个字符向量,包括一些重复的元素,例如

v <- c("d09", "d11", "d13", "d01", "d02", "d10", "d13")

另一个包含这些字符的单个计数的向量,例如

x <- c("d10", "d11", "d13")

我想从第二个向量x中仅删除v中每个元素的第一个出现位置。在此示例中,d13出现xv出现v,但"d09", "d01", "d02", "d13" 仅删除第一个匹配,并保留副本。因此,我想最终得到:

z <- v[!(v %in% x)]

我一直在尝试各种各样的事情,例如x但它会继续删除"d09", "d01", "d02" 所有个字符的实例,而不仅仅是第一个,所以我最终会改为:

webClient.DownloadFileAsync

如何只删除重复元素的一个实例?

2 个答案:

答案 0 :(得分:17)

您可以使用match和否定索引。

v[-match(x, v)]

产生

[1] "d09" "d01" "d02" "d13"

match仅返回值的第一个匹配位置,我们在此处使用这个位置。

请注意,%in%is.elementmatch的简并版本。比较:

match(x, v)            # [1] 6 2 3
match(x, v) > 0        # [1] TRUE TRUE TRUE
x %in% v               # [1] TRUE TRUE TRUE
is.element(x, v)       # [1] TRUE TRUE TRUE

最后三个都是相同的,基本上是第一个的强制逻辑版本(事实上,请参阅%in%is.element的代码)。这样做会丢失关键信息,这是x vx第一次匹配的位置,只知道v中存在v %in% x值。

相反,v表示与您想要的不同,即“x中的哪些值在/* .. */”中,因为所有重复的值都不符合您的要求将满足这一条件。

答案 1 :(得分:1)

is.element

v[!is.element(v,x)]