R 删除序列中重复的数字

R 删除序列中重复的数字,r,duplicates,R,Duplicates,我有一个这样的向量 c(3,3,...,9,9,...,2,2,...,3,3,...,7,7,...) 我想在不破坏顺序的情况下删除序列中重复的数字。这是,我想得到类似的东西 c(3,9,2,3,7,...) 如何在R中执行此操作?我们可以尝试使用rleid和复制的。我们使用rleid(来自data.table)创建游程长度ID,以便只有相等的相邻元素构成一个组,获得不重复的值的逻辑索引,并将向量子集 library(data.table) v1[!duplicated(rleid(v1)

我有一个这样的向量

c(3,3,...,9,9,...,2,2,...,3,3,...,7,7,...)
我想在不破坏顺序的情况下删除序列中重复的数字。这是,我想得到类似的东西

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

如何在R中执行此操作?

我们可以尝试使用
rleid
复制的
。我们使用
rleid
(来自
data.table
)创建游程长度ID,以便只有相等的相邻元素构成一个组,获得不重复的
值的逻辑索引,并将向量子集

library(data.table)
v1[!duplicated(rleid(v1))]
#[1] 3 9 2 3 7

或者正如OP所提到的,我们可以从
base R
中使用
rle
,并提取

rle(v1)$values
#[1] 3 9 2 3 7
数据
v1我们还可以观察到序列中的重复序列与相邻序列的差异为0。因此,使用base-R,我们可以:

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

为了好玩,这里有一个解决问题的
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
库(Rcpp)
cppFunction('NumericVector remove_倍数(NumericVector&vec){
数字载体c_-vec(克隆(vec));
NumericVector::iterator it=std::unique(c_vec.begin(),c_vec.end());
c_vec.erase(it,c_vec.end());
返回(c_vec);
}'
)
x移除_倍数(x)
[1] 1 2 1 3 4 1

可能与相关,但从技术上讲,它不是重复。注意
rle(v)$values
正确处理
NA
s和非数值。这个解决方案只适用于数值的简化情况,不缺少数值。你们都是对的。但是,问题描述中未提及缺失数据,@Akrun的答案已被接受,并且该答案在评论中有警告。投票不是我的错。
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