我有一个
类型的向量c(3,3,...,9,9,...,2,2,...,3,3,...,7,7,...)
我想删除序列中重复的数字,而不会破坏顺序。这是,我想获得像
这样的东西c(3,9,2,3,7,...)
我怎样才能在R?
中这样做答案 0 :(得分:9)
我们还可以使用观察到序列中的重复与其邻居的差异为0。因此,使用base-R,我们可以做到:
v[c(1,diff(v))!=0]
答案 1 :(得分:6)
我们可以尝试使用rleid
和duplicated
。我们使用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