【问题标题】:Remove first occurrence of elements in a vector from another vector从另一个向量中删除向量中第一次出现的元素
【发布时间】:2015-07-19 17:09:56
【问题描述】:

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

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

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

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

我只想从第二个向量v 中删除x 中每个元素的第一次。在此示例中,d13x 中出现,在 v 中出现两次,但仅从 v 中删除第一个匹配项并保留重复项。因此,我想结束:

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

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

"d09", "d01", "d02"

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

【问题讨论】:

    标签: r duplicates


    【解决方案1】:

    您可以使用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的代码)。这样做会丢失关键信息,即xv 中的第一个匹配位置,并且只知道x 值存在于v 中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多