假设我有这个数据框
set.seed(2)
df <- data.frame(c1 = sample(c(0:3,NA), 50, replace = T), c2 = sample(c(0:3,NA), 50, replace = T),
c3 = sample(c(0:3,NA), 50, replace = T), c4 = sample(c(0:3,NA), 50, replace = T))
head(df)
c1 c2 c3 c4
1 0 0 1 0
2 3 0 2 1
3 2 3 NA NA
4 0 NA NA 1
5 NA 1 1 3
6 NA NA 2 1
当c4为0时,我想用c3中的下一个可用的非NA值替换它。如果c3是NA,那么c2,依此类推。
我正在努力学习如何去做,所以不要只是回答!如果没关系,建议可能的解决方案。提前谢谢。
编辑:
预期产出:
head(df)
c1 c2 c3 c4
1 0 0 1 1 # This would be the only difference with the head output from above
2 3 0 2 1
3 2 3 NA NA
4 0 NA NA 1
5 NA 1 1 3
6 NA NA 2 1
答案 0 :(得分:3)
这就是你如何做到而不用遍历每一行:
c4 <- ncol(df)
inds <- max.col(!is.na(df[,-c4]) & df[,-c4]!=0, "last")
zeroinds <- which((df[,c4]==0)==T)
df[zeroinds,c4] <- df[cbind(zeroinds,inds[zeroinds])]
head(df, 10)
# c1 c2 c3 c4
# 1 0 0 1 1
# 2 3 0 2 1
# 3 2 3 NA NA
# 4 0 NA NA 1
# 5 NA 1 1 3
# 6 NA NA 2 1
# 7 0 3 NA NA
# 8 NA NA 2 2
# 9 2 3 0 3
# 10 2 3 0 1
以下是:
c4
作为最后一栏c4
c4
中找到零为零的行并将其放入zeroinds
zeroinds
的零替换为每行第一个非NA和非零值