我正在研究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)
答案 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 } ))