使用dplyr::mutate指定列范围批量运算并忽略NA值的实现方法
dplyr按列范围做逐行运算并忽略NA的实现方法
问题根因
你现有代码的异常结果来自两个错误逻辑:
- 直接使用
+运算符做列运算时,任意参与运算的值为NA就会返回NA,且你将na.rm=T放在了mutate()的参数层级,该参数对+运算无效,还会被识别为单独的赋值逻辑,因此返回异常的TRUE值。 - dplyr不支持直接写
a to c的列范围语法,需要配合官方提供的列选择函数使用。
解决方案
推荐两种常用实现方式,都可以满足你指定列范围、忽略NA值的需求:
方式1:使用rowSums()(性能最优,适合求和场景)
library(dplyr) df3 <- df %>% mutate(E = rowSums(across(a:c), na.rm = TRUE))
代码说明:
across(a:c)会自动匹配从列a到列c的所有列,无需逐一写列名rowSums()按行求和,na.rm = TRUE直接传给求和逻辑,自动忽略NA值- 如果需要在列范围基础上额外排除某列,可以把选择逻辑改成
across(a:c & !d),就会剔除d列参与运算
方式2:使用rowwise() + c_across()(灵活性更高,适合复杂逐行运算)
如果你后续需要做的不是简单求和,是其他自定义逐行运算,可以用这个方案:
library(dplyr) df3 <- df %>% rowwise() %>% # 开启逐行运算模式 mutate(E = sum(c_across(a:c), na.rm = TRUE)) %>% ungroup() # 运算完成后取消行分组,避免影响后续数据操作
结果验证
最终生成的E列值为:18, 21, 16, 27, 15,符合忽略NA的求和预期。
内容的提问来源于stack exchange,提问作者Josch
相关产品推荐
相关产品推荐

