首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除R中每行的连续重复值

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

Stack Overflow用户
提问于 2017-04-24 16:39:18
回答 2查看 813关注 0票数 5

我正在处理R中的一个数据集,其中我希望删除每行连续的重复值。例如,行(19,15,19,19)应该变成行(19,15,19)。

我尝试使用duplicated(df),但这会删除所有产生(19,15)的重复,而不仅仅是连续的重复。

可重现的示例:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2017-04-24 16:41:32

我们可以遍历行并根据游程长度编码获得唯一的元素,以创建vectorlist

代码语言:javascript
复制
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作为末尾添加,以使元素的数量相同

代码语言:javascript
复制
do.call(rbind, lapply(lst, `length<-`, max(lengths(lst))))

更新

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

代码语言:javascript
复制
do.call(rbind, lapply(lst, function(x) {
            x[setdiff(colnames(trajectories), names(x))] <- NA
            x[colnames(trajectories)]}))

或者另一种选择是获得每行中相邻元素之间的difference,基于差值不为零来创建逻辑向量以对元素进行子集

代码语言:javascript
复制
apply(trajectories, 1, FUN = function(x) x[c(TRUE, diff(x)!=0)])

或其他适用于该示例的选项

代码语言:javascript
复制
 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]])
票数 6
EN

Stack Overflow用户

发布于 2017-04-24 17:35:34

代码语言:javascript
复制
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 ...

代码语言:javascript
复制
t(apply(trajectories, 1, function(x) { x[c(F, diff(x) == 0)] <- NA; x } ))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43583389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档