在一个序列中删除重复的数字

4

我有一个类型为

向量
c(3,3,...,9,9,...,2,2,...,3,3,...,7,7,...)

我希望能够在不破坏顺序的情况下,移除序列中重复的数字。换句话说,我想要得到像这样的结果:

c(3,9,2,3,7,...)

我该如何在R中完成这个任务?

可能与这个有关,但从技术上讲并不是重复。 - akrun
3个回答

9

我们还可以观察到,序列中的重复元素与其相邻元素之间的差为0。因此,使用基本的R语言,我们可以进行以下操作:

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

1
请注意,rle(v)$values 可以正确处理 NA 和非数字值。该解决方案仅适用于没有缺失值的数值简单情况。 - A. Webb
你们两个都是对的。然而,在问题描述中没有提到缺失的数据,@Akrun的答案已经被接受了,而这个答案在评论中有一个警告。点赞不是我的错。 - Heroka

7
我们可以尝试使用 rleidduplicated。我们使用 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)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接