结转多列 R 的 NA 值

Carry forward NA values for multiple columns R

我需要将 NA 值从一列转移到下一列。代码示例如下

df <- data.frame(a = c(1,2,NA,NA,NA,NA,NA,NA,NA,NA),
           b =c(NA,NA,3,4,NA,NA,NA,NA,NA,NA),
           c = c(NA,NA,NA,NA,5,6,NA,NA,NA,NA),
           d = c(NA,NA,NA,NA,NA,NA,7,8,NA,NA),
           e = c(NA,NA,NA,NA,NA,NA,NA,NA,9,10))

我曾尝试在 zoo 中使用带有 na.locf 函数的循环,但这只包含前几列的值

columns <- seq(2,ncol(df))
output <- list()
for (i in columns){
  output[[i]] <- t(zoo::na.locf(t(df[,(i-1):i])))[,2]
}

预期的输出会像

expected_output <- data.frame(a = c(1,2,NA,NA,NA,NA,NA,NA,NA,NA),
           b = c(1,2,3,4,NA,NA,NA,NA,NA,NA),
           c = c(1,2,3,4,5,6,NA,NA,NA,NA),
           d = c(1,2,3,4,5,6,7,8,NA,NA),
           e = c(1,2,3,4,5,6,7,8,9,10))

转置 df,应用 na.locf,再次转置并替换 df 内容,使其成为具有正确名称的数据框。

library(zoo)

out <- replace(df, TRUE, t(na.locf(t(df), fill = NA)))
identical(out, expected_output)
## [1] TRUE

这也有效并且类似,只是它对每一行应用 na.locf0 而不是对转置应用 na.locf

out <- replace(df, TRUE, t(apply(df, 1, na.locf0)))
identical(out, expected_output)
## [1] TRUE