【问题标题】:Remove repeated numbers in a sequence删除序列中的重复数字
【发布时间】:2016-05-22 12:45:13
【问题描述】:

我有一个类型的向量

c(3,3,...,9,9,...,2,2,...,3,3,...,7,7,...)

我想在不破坏顺序的情况下删除序列中的重复数字。这是,我想获得类似

c(3,9,2,3,7,...)

如何在 R 中做到这一点?

【问题讨论】:

  • 可能与this有关,但从技术上讲,这又不是骗局。

标签: r duplicates


【解决方案1】:

我们还可以使用序列中的重复项与其邻居的差异为 0 的观察。因此,使用base-R,我们可以做到:

v[c(1,diff(v))!=0]

【讨论】:

  • 注意rle(v)$values“正确”处理NAs 和非数值。此解决方案仅适用于没有缺失值的简化数值情况。
  • 你说的都是对的。但是,问题描述中没有提到丢失的数据,@Akrun 的答案已被接受,并且该答案在 cmets 中有警告。赞成票不是我的错。
【解决方案2】:

我们可以试试rleidduplicated。我们使用rleid(来自data.table)创建run-length-ids,以便只有相等的相邻元素形成一个组,获取非duplicated值的逻辑索引并对向量进行子集化。

library(data.table)
v1[!duplicated(rleid(v1))]
#[1] 3 9 2 3 7

或者如OP所述,我们可以使用base R中的rle并提取values

rle(v1)$values
#[1] 3 9 2 3 7

数据

 v1 <- c(3,3,9,9,2,2,3,3,7,7)

【讨论】:

    【解决方案3】:

    只是为了好玩,这里有一个解决问题的Rcpp版本:

    library(Rcpp)
    cppFunction('NumericVector remove_multiples(NumericVector& vec) {   
       NumericVector c_vec(clone(vec));
       NumericVector::iterator it = std::unique(c_vec.begin(),c_vec.end());
       c_vec.erase(it,c_vec.end());
       return(c_vec);
      }'
    )
    
    x <- c(1,1,1,2,2,2,1,1,3,4,4,1,1)    
    > remove_multiples(x)
    [1] 1 2 1 3 4 1
    

    【讨论】:

      猜你喜欢
      • 2020-03-26
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      相关资源
      最近更新 更多