我正在处理R中的一个数据集,其中我希望删除每行连续的重复值。例如,行(19,15,19,19)应该变成行(19,15,19)。
我尝试使用duplicated(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)发布于 2017-04-24 16:41:32
我们可以遍历行并根据游程长度编码获得唯一的元素,以创建vector的list
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)]}))或者另一种选择是获得每行中相邻元素之间的difference,基于差值不为零来创建逻辑向量以对元素进行子集
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]])发布于 2017-04-24 17:35:34
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 } ))https://stackoverflow.com/questions/43583389
复制相似问题