我有一个字符向量,包括一些重复的元素,例如
v <- c("d09", "d11", "d13", "d01", "d02", "d10", "d13")
另一个包含这些字符的单个计数的向量,例如
x <- c("d10", "d11", "d13")
我想从第二个向量x
中仅删除v
中每个元素的第一个出现位置。在此示例中,d13
出现x
,v
出现v
,但"d09", "d01", "d02", "d13"
仅删除第一个匹配,并保留副本。因此,我想最终得到:
z <- v[!(v %in% x)]
我一直在尝试各种各样的事情,例如x
但它会继续删除"d09", "d01", "d02"
中所有个字符的实例,而不仅仅是第一个,所以我最终会改为:
webClient.DownloadFileAsync
如何只删除重复元素的一个实例?
答案 0 :(得分:17)
您可以使用match
和否定索引。
v[-match(x, v)]
产生
[1] "d09" "d01" "d02" "d13"
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
最后三个都是相同的,基本上是第一个的强制逻辑版本(事实上,请参阅%in%
和is.element
的代码)。这样做会丢失关键信息,这是x
v
中x
第一次匹配的位置,只知道v
中存在v %in% x
值。
相反,v
表示与您想要的不同,即“x
中的哪些值在/* .. */
”中,因为所有重复的值都不符合您的要求将满足这一条件。
答案 1 :(得分:1)
is.element
v[!is.element(v,x)]