首页 文章

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

提问于
浏览
14

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

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

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

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

我想从第二个向量 v 中仅删除 x 中每个元素的第一个匹配项 . 在此示例中, d13 出现在 x 中,两次出现在 v 中,但只有第一个匹配项从 v 中删除,并且保留了副本 . 因此,我想最终得到:

"d09", "d01", "d02", "d13"

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

"d09", "d01", "d02"

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

2 回答

  • 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 的代码) . 这样做会丢失关键信息,这是 vx 的第一个匹配位置,并且只知道 v 中存在 x 值 .

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

  • 1

    is.element

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

相关问题