按顺序删除重复的数字

时间:2016-02-11 16:14:47

标签: r duplicates

我有一个

类型的向量
c(3,3,...,9,9,...,2,2,...,3,3,...,7,7,...)

我想删除序列中重复的数字,而不会破坏顺序。这是,我想获得像

这样的东西
c(3,9,2,3,7,...)

我怎样才能在R?

中这样做

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:6)

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

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

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

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

数据

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

答案 2 :(得分:2)

只是为了它的乐趣,这是解决问题的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