【发布时间】: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