我有一个类型为
向量c(3,3,...,9,9,...,2,2,...,3,3,...,7,7,...)
我希望能够在不破坏顺序的情况下,移除序列中重复的数字。换句话说,我想要得到像这样的结果:
c(3,9,2,3,7,...)
我该如何在R中完成这个任务?
我有一个类型为
向量c(3,3,...,9,9,...,2,2,...,3,3,...,7,7,...)
我希望能够在不破坏顺序的情况下,移除序列中重复的数字。换句话说,我想要得到像这样的结果:
c(3,9,2,3,7,...)
我们还可以观察到,序列中的重复元素与其相邻元素之间的差为0。因此,使用基本的R语言,我们可以进行以下操作:
v[c(1,diff(v))!=0]
rle(v)$values
可以正确处理 NA
和非数字值。该解决方案仅适用于没有缺失值的数值简单情况。 - A. Webbrleid
和 duplicated
。我们使用 rleid
(来自于 data.table
库)创建运行长度 ID,以便仅将相邻且相等的元素形成一组,获取非重复值的逻辑索引并对向量进行子集化。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)
仅仅为了好玩,这里介绍一下使用 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