删除R中每行的连续重复值

时间:2017-04-24 08:39:18

标签: r duplicates

我正在研究R中的数据集,我想删除连续的重复值PER ROW。 例如,行(19,15,19,19)应该成为行(19,15,19)。

我尝试使用重复(df),但这会删除所有重复项,从而导致(19,15)而不是仅连续重复项。

可再现的例子:

a <- c(19,18,19,9,9,19,19)
b <- c(15,0,19,9,19,19,13)
c <- c(19,0,13,19,19,19,0)
d <- c(19,0,0,19,19,0,0)

trajectories <- cbind(a,b,c,d)

2 个答案:

答案 0 :(得分:5)

我们可以循环遍历行并根据游程编码获取唯一元素,以创建list vector

lst <- apply(trajectories, 1, FUN = function(x) rle(x)$values)
lst
#[[1]]
# a  b  d 
#19 15 19 

#[[2]]
# a  d 
#18  0 

#[[3]]
# b  c  d 
#19 13  0 

#[[4]]
# b  d 
# 9 19 

#[[5]]
# a  d 
# 9 19 

#[[6]]
# c  d 
#19  0 

#[[7]]
# a  b  d 
#19 13  0 

我们可以附加NA作为结尾,以使元素数量相同

do.call(rbind, lapply(lst, `length<-`, max(lengths(lst))))

更新

正如@Sotos所提到的,如果我们需要原始的列名完整,那么

do.call(rbind, lapply(lst, function(x) {
            x[setdiff(colnames(trajectories), names(x))] <- NA
            x[colnames(trajectories)]}))

或者另一种选择是在每行中的相邻元素之间获得diff,根据差异为零来创建逻辑向量以对元素进行子集

apply(trajectories, 1, FUN = function(x) x[c(TRUE, diff(x)!=0)])

或另一个适用于示例的选项

 i1 <- which(cbind(1, trajectories[,-1] -
         trajectories[,-ncol(trajectories)])!=0, arr.ind=TRUE)
 lapply(split(1:nrow(i1), i1[,1]), function(i) trajectories[i1[i,, drop = FALSE]])

答案 1 :(得分:0)

a <- c(19,18,19,9,9,19,19)
b <- c(15,0,19,9,19,19,13)
c <- c(19,0,13,19,19,19,0)
d <- c(19,0,0,19,19,0,0)

trajectories <- cbind(a,b,c,d)
trajectories

t(apply(trajectories, 1, function(x) { x[c(F, diff(x) == 0)] <- 0; x } ))

您可以通过更改<- 0部分将连续副本设置为“0”以外的其他内容,例如将其设置为NA而不是......

t(apply(trajectories, 1, function(x) { x[c(F, diff(x) == 0)] <- NA; x } ))