代码之家  ›  专栏  ›  技术社区  ›  OKLM

在R中为某些列填写NA

  •  0
  • OKLM  · 技术社区  · 4 年前

    我正在运行线性回归,但我的许多观察结果都可以使用,因为一些值在行中有一个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))
    

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

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

    1 回复  |  直到 4 年前
        1
  •  1
  •   akrun    4 年前

    我们可以创建一个逻辑向量 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
  •  0
  •   LMc    4 年前

    您可以使用 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