关于R语言sum()与rowSums()空向量求和返回0的合理性问询
为什么R中空向量求和返回0?
先还原你的测试场景:
创建测试矩阵:
mat <- matrix(c(1:8, rep(NA, 4), rep(0, 3)), ncol=3, byrow=T) mat # [,1] [,2] [,3] # [1,] 1 2 3 # [2,] 4 5 6 # [3,] 7 8 NA # [4,] NA NA NA # [5,] 0 0 0
默认rowSums计算结果:
rowSums(mat) # [1] 6 15 NA NA 0
开启na.rm=T后的结果:
rowSums(mat, na.rm=T) # [1] 6 15 15 0 0
空向量求和验证:
sum(c()) # [1] 0
空向量求和返回0的核心原因
这不是任意设定,而是代数运算的一致性要求:求和运算的单位元是0(类似乘法的单位元是1)。当没有元素可累加时,返回单位元能保证运算逻辑自洽:
- 比如
sum(c(5, c()))会等于5+0=5,符合直觉; - 如果返回NA,会打破这种一致性,导致简单的拼接求和出现无意义的缺失值。
回应你的两个疑问
1. 如何区分全NA行与全0行
R中na.rm=T的作用是忽略缺失值,对剩余有效元素计算。全NA行在移除NA后变成空向量,因此返回0。如果需要区分这两种场景,不能依赖rowSums的结果,需单独判断行是否全为NA:
# 标记所有全NA的行 all_na_rows <- apply(mat, 1, function(x) all(is.na(x))) # 重新生成带区分的求和结果 row_sums_adjusted <- rowSums(mat, na.rm=T) row_sums_adjusted[all_na_rows] <- NA row_sums_adjusted # [1] 6 15 15 NA 0
2. 为什么默认空向量返回数值型0?
sum函数会根据输入类型返回对应运算的单位元:
- 空数值向量返回0(数值求和的单位元);
- 空逻辑向量
sum(logical())也返回0(逻辑值在R中会被转换为1/0计算); - 空字符向量
sum(character())会直接报错,因为字符类型不支持求和运算。
这里的关键是:空向量是明确没有元素,不是元素缺失,因此不会返回代表缺失的NA。
内容的提问来源于stack exchange,提问作者Ravenskud
相关产品推荐
相关产品推荐

