【问题标题】:Carry forward NA values for multiple columns R为多列 R 结转 NA 值
【发布时间】:2020-05-14 13:07:28
【问题描述】:

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

【问题讨论】:

    标签: r loops na zoo


    【解决方案1】:

    转置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
    

    【讨论】:

    • 完美,比我尝试的要简单得多!
    猜你喜欢
    • 1970-01-01
    • 2017-01-14
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    相关资源
    最近更新 更多