根据另一列中的可用值动态替换列的值

时间:2016-10-20 21:39:25

标签: r dataframe

假设我有这个数据框

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

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

以下是:

  1. c4作为最后一栏
  2. 我们在c4
  3. 之前找到每行的第一个非NA和非零值
  4. c4中找到零为零的行并将其放入zeroinds
  5. zeroinds的零替换为每行第一个非NA和非零值