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

rw2*_*rw2 14 r duplicates

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

v <- c("d09", "d11", "d13", "d01", "d02", "d10", "d13")
Run Code Online (Sandbox Code Playgroud)

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

x <- c("d10", "d11", "d13")
Run Code Online (Sandbox Code Playgroud)

我想从第二个向量中仅删除每个元素的第一个出现位置.在此示例中,发生在两次,但仅删除第一个匹配,并保留副本.因此,我想最终得到:xvd13xvv

"d09", "d01", "d02", "d13"
Run Code Online (Sandbox Code Playgroud)

我一直在尝试各种各样的东西,z <- v[!(v %in% x)] 但它不断删除所有角色的实例x,而不仅仅是第一个,所以我最终得到了这个:

"d09", "d01", "d02"
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能删除重复元素的一个实例?

Bro*_*ieG 17

您可以使用match和负索引.

v[-match(x, v)]
Run Code Online (Sandbox Code Playgroud)

产生

[1] "d09" "d01" "d02" "d13"
Run Code Online (Sandbox Code Playgroud)

match 只返回值的第一个匹配位置,我们在这里使用它们.

需要注意的是%in%is.element是简并版本match.相比:

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
Run Code Online (Sandbox Code Playgroud)

最后三个都是相同的,基本上是强制到第一个的逻辑版本(事实上,参见代码%in%is.element).在这样做,你失去了关键信息,这是第一场比赛的位置xv和所剩下的只是知道,x在存在价值v.

相反,v %in% x意味着与您想要的东西不同,即"哪些值vx"中,这将不符合您的要求,因为所有重复值都将满足该条件.