【问题标题】:Fill NAs in R for certain columns在 R 中为某些列填充 NA
【发布时间】:2021-04-15 20:38:49
【问题描述】:

我正在运行线性回归,但我的许多观察结果都可以使用,因为其中一些值在行中有一个 NA。我知道,如果输入了一组变量中的一个,那么 NA 实际上是 0。但是,如果所有值都是 NA,那么列不会改变。我将包括示例,因为我知道这可能会令人困惑。

我所拥有的是看起来像这样的东西:

df <- data.frame(outcome = c(1, 0, 1, 1, 0),
                 Var1 = c(1, 0, 1, NA, NA),
                 Var2 = c(NA, 1, 0, 0, NA),
                 Var3 = c(0, 1, NA, 1, NA))

对于变量 1-3,前 4 行有一个 NA,但在其他变量中有其他条目。然而,在最后一行中,所有值都是 NA。我知道最后一行中的所有内容都是 NA,但我希望前 4 行中的 NA 填充为 0。期望的结果如下所示:

desired - data.frame(outcome = c(1, 0, 1, 1, 0),
                     Var1 = c(1, 0, 1, 0, NA),
                     Var2 = c(0, 1, 0, 0, NA),
                     Var3 = c(0, 1, 0, 1, NA))

我知道我可以通过一些混乱的方式来解决这个问题,但我想知道最简化的流程是什么?

我希望这是有道理的,我知道这个问题令人困惑。如果需要,我可以澄清任何事情。

【问题讨论】:

    标签: r data-manipulation data-cleaning


    【解决方案1】:

    我们可以使用 rowSums 创建一个逻辑向量,在将 NA 更改为 0 之前使用它来对行进行子集化

    i1 <- rowSums(!is.na(df[-1])) > 0
    df[i1, -1][is.na(df[i1, -1])] <- 0
    

    -检查所需

    identical(df, desired)
    #[1] TRUE
    

    【讨论】:

      【解决方案2】:

      您可以使用apply 有条件地替换某些行中的NA

      data.frame(t(apply(df, 1, function(x) if (all(is.na(x[-1]))) x else replace(x, is.na(x), 0))))
      

      输出

       outcome Var1 Var2 Var3
      1       1    1    0    0
      2       0    0    1    1
      3       1    1    0    0
      4       1    0    0    1
      5       0   NA   NA   NA
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-12
        • 2020-09-28
        相关资源
        最近更新 更多