我有一个类型为

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


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

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


我该如何在R中做到这一点?

评论

可能与此有关,但从技术上又不是骗子。

#1 楼

我们可以尝试使用rleidduplicated。我们使用rleid(来自data.table)创建游程长度ID,以便仅相等的相邻元素形成一组,获得非duplicated值的逻辑索引,并将向量作为子集。 />

或如前所述,我们可以使用rle中的base R并提取values。 br />
library(data.table)
v1[!duplicated(rleid(v1))]
#[1] 3 9 2 3 7


#2 楼

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

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


评论


注意rle(v)$ values可“正确”处理NA和非数值。此解决方案仅在数字值不存在缺失值的情况下起作用。

– A. Webb
16-2-11在17:01



你们都是对的。但是,问题描述中未提及缺少数据,@ Akrun的答案已被接受,并且此答案在注释中有警告。投票不是我的错。

–英雄
16年2月11日在17:48

#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