为何sum(rep(NA,3),na.rm=TRUE)返回0?如何让全NA行返回NA?
关于R中缺失值求和的两个问题解答
一、sum(rep(NA, 3), na.rm = TRUE)返回0的逻辑
当设置na.rm = TRUE时,R会先移除所有NA值再执行求和操作。如果原向量全是NA,移除后就没有任何元素了——而数学上空集的和定义为加法单位元0,R遵循了这个数学惯例,所以返回0。
二、实现“忽略NA求和,但全NA行返回NA”的行求和方法
直接用rowSums无法同时满足需求,需要结合逻辑判断实现:
方法1:基础R代码
# 构造示例矩阵 mat <- matrix(c(NA, NA, NA, 2), nrow = 2) # 先忽略NA计算行和 row_sums <- rowSums(mat, na.rm = TRUE) # 找出所有元素都是NA的行 all_na_rows <- rowSums(is.na(mat)) == ncol(mat) # 将全NA行的结果替换为NA row_sums[all_na_rows] <- NA row_sums # 输出结果:[1] NA 2
方法2:tidyverse风格实现(需加载dplyr包)
library(dplyr) mat %>% as.data.frame() %>% rowwise() %>% mutate(row_sum = ifelse(all(is.na(c_across())), NA, sum(c_across(), na.rm = TRUE))) %>% pull(row_sum) # 输出结果:[1] NA 2
内容的提问来源于stack exchange,提问作者mat
相关产品推荐
相关产品推荐

