c(3,3,...,9,9,...,2,2,...,3,3,...,7,7,...)
的向量,我想在不破坏顺序的情况下删除序列中的重复数字。这是我想获得的类似
c(3,9,2,3,7,...)
我该如何在R中做到这一点?
#1 楼
我们可以尝试使用rleid
和duplicated
。我们使用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
评论
可能与此有关,但从技术上又不是骗子。