我有以下数据框dat
,它在某些行的开头呈现特定于行的 NA 数量:
dat <- as.data.frame(rbind(c(NA,NA,1,3,5,NA,NA,NA), c(NA,1:3,6:8,NA), c(1:7,NA)))
dat
# V1 V2 V3 V4 V5 V6 V7 V8
# NA NA 1 3 5 NA NA NA
# NA 1 2 3 6 7 8 NA
# 1 NA 2 3 4 5 6 NA
我的目标是删除每行开头的所有 NA 并左移行值(相应地在移动行的末尾添加 NA,以保持其长度恒定)。
以下代码按预期工作:
for (i in 1:nrow(dat)) {
if (is.na(dat[i,1])==TRUE) {
dat1 <- dat[i, min(which(!is.na(dat[i,]))):length(dat[i,])]
dat[i,] <- data.frame( dat1, t(rep(NA, ncol(dat)-length(dat1))) )
}
}
dat
返回:
# V1 V2 V3 V4 V5 V6 V7 V8
# 1 3 5 NA NA NA NA NA
# 1 2 3 6 7 8 NA NA
# 1 NA 2 3 4 5 6 NA
我想知道是否有更直接的方法来做到这一点,而不使用 for 循环并使用tail
功能。
关于最后一点,通过使用min(which(!is.na(dat[1,])))
结果是3
,正如预期的那样。但如果我输入tail(dat[1,],min(which(!is.na(dat[1,]))))
结果是相同的初始行,我不明白为什么..
非常感谢阿努的建议。