【发布时间】:2016-05-22 12:45:13
【问题描述】:
我有一个类型的向量
c(3,3,...,9,9,...,2,2,...,3,3,...,7,7,...)
我想在不破坏顺序的情况下删除序列中的重复数字。这是,我想获得类似
c(3,9,2,3,7,...)
如何在 R 中做到这一点?
【问题讨论】:
-
可能与this有关,但从技术上讲,这又不是骗局。
标签: r duplicates
我有一个类型的向量
c(3,3,...,9,9,...,2,2,...,3,3,...,7,7,...)
我想在不破坏顺序的情况下删除序列中的重复数字。这是,我想获得类似
c(3,9,2,3,7,...)
如何在 R 中做到这一点?
【问题讨论】:
标签: r duplicates
我们还可以使用序列中的重复项与其邻居的差异为 0 的观察。因此,使用base-R,我们可以做到:
v[c(1,diff(v))!=0]
【讨论】:
rle(v)$values“正确”处理NAs 和非数值。此解决方案仅适用于没有缺失值的简化数值情况。
我们可以试试rleid 和duplicated。我们使用rleid(来自data.table)创建run-length-ids,以便只有相等的相邻元素形成一个组,获取非duplicated值的逻辑索引并对向量进行子集化。
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
【讨论】: