【问题标题】:How to remove repeated elements in a vector, similar to 'set' in Python如何去除向量中的重复元素,类似于Python中的'set'
【发布时间】:2012-06-01 22:26:12
【问题描述】:

我有一个包含重复元素的向量,并想删除它们,以便每个元素只出现一次。

在 Python 中,我可以从向量构造一个 Set 来实现这一点,但我如何在 R 中做到这一点?

【问题讨论】:

  • 您能否提供一些示例数据来说明“重复”的含义。并非所有 R 用户都知道 python 中“只是将向量‘馈送’到集合”是什么意思。重复是指重复还是连续重复?前者见?duplicated
  • 要仅删除连续重复,请使用v <- c(1, 1, 5, 5, 2, 2, 6, 6, 1, 3) 下方的答案示例,您可以将向量与其自身的移位版本进行比较:v[c(TRUE, !v[-length(v)] == v[-1])]。它将返回1 5 2 6 1 3,保持第二个重复的1 与第一个不连续。

标签: python r duplicates


【解决方案1】:

您可以查看unique函数。

 > v = c(1, 1, 5, 5, 2, 2, 6, 6, 1, 3)
 > unique(v)
 [1] 1 5 2 6 3

【讨论】:

    【解决方案2】:

    这做同样的事情。如果您还需要重复项的逻辑向量,则速度较慢,但​​很有用:

    v[duplicated(v)]
    

    【讨论】:

    • 这也有可能在命名向量中保留名称,而unique 只是删除它们。
    • 这很好,但如果你想真正删除元素,你应该这样做v[!duplicated(v)]。在这种情况下,它将始终保留第一个重复项,我想知道是否有办法改变它(并随机选择一个重复项)?
    【解决方案3】:

    要仅删除连续的重复元素,您可以将向量与自身的移位版本进行比较:

    v <- c(1, 1, 5, 5, 5, 5, 2, 2, 6, 6, 1, 3, 3)
    v[c(TRUE, !v[-length(v)] == v[-1])]
    [1] 1 5 2 6 1 3
    

    同样可以用dplyr写得更优雅一点:

    library(dplyr)
    v[v != lag(v)]
    [1] NA  5  2  6  1  3
    

    lag() 返回的 NA 删除了第一个值,要保留第一个值,您可以将默认值更改为与第一个值不同的值。

    v[v != lag(v, default = !v[1])]
    [1] 1 5 2 6 1 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-19
      • 2019-12-14
      • 2020-12-28
      • 2019-07-12
      • 2018-09-30
      • 1970-01-01
      • 2023-01-01
      • 1970-01-01
      相关资源
      最近更新 更多