多列R的正向NA值

问题描述 投票:0回答:1

我需要将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))

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

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))
r loops na zoo
1个回答
2
投票

[转置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
© www.soinside.com 2019 - 2024. All rights reserved.