【问题标题】:R returns row sum as zero in case of all NA在所有 NA 的情况下,R 将行总和返回为零
【发布时间】:2019-02-27 05:13:03
【问题描述】:

在使用 na.rm =T 计算 rowSum 时所有行都是 NA 的情况下是否有避免 0 的结果

在下面的示例中,如果所有行都是 NA,则行总和为零,但我在结果中需要 NA。我不能跳过使用 na.rm = T 因为其他情况可能有一些 NA。
我正在专门寻找数据表解决方案。

`df <- data.table::fread("X Y
2   26
3   NA
0 0
NA  NA
4   5
", header = TRUE)
df[,Sum:=rowSums(.SD,na.rm = T), .SDcols = names(df)]`

【问题讨论】:

  • 感谢@DavidArenburg 指出我之前的想法是错误的。我相信这应该可行(并且会保留 sum = 0 的情况,但并非所有行值都是 NA):df[,Sum:={rs = rowSums(.SD,na.rm = T); ifelse(rowSums(is.na(.SD)) == ncol(.SD), NA, rs)}, .SDcols = names(df)]
  • 这是我的错。我应该提供一个示例数据行,其中所有行都为零
  • 您可以执行df[, Sum := rowMeans(.SD, na.rm = TRUE) * rowSums(!is.na(.SD)), .SDcols = names(df)] 之类的操作并获取NaN 而不是NA。但我不确定它的效率/可读性如何。
  • 可能类似于df[, Sum:= ifelse(rowSums(is.na(.SD[, 1:length(.SD)])) == length(.SD), NA, rowSums(.SD[, 1:length(.SD)], na.rm = TRUE)), .SDcols = names(df)]

标签: r data.table


【解决方案1】:

有很多方法可以做到这一点。我的意见:

df[, Sum:= rowSums(df, na.rm = TRUE) * NA ^ (rowSums(!is.na(df)) == 0)]

将返回:

    X  Y Sum
1:  2 26  28
2:  3 NA   3
3:  0  0   0
4: NA NA  NA
5:  4  5   9

【讨论】:

    【解决方案2】:

    另一种方式,仅在您不想成为 NA 的行上调用 rowSums 函数。引用分配调用将用 NA 填充其余部分:

    df[, .SD
       ][Reduce('*', lapply(df, is.na)) == 0, sum := rowSums(.SD, na.rm=T)
       ][]
    
        X  Y sum
    1:  2 26  28
    2:  3 NA   3
    3:  0  0   0
    4: NA NA  NA
    5:  4  5   9
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2023-03-10
      相关资源
      最近更新 更多