dplyr分组汇总时,如何让全NA组返回NA而非0?
解决dplyr分组求和时全NA返回NA的问题
原代码中,当组内所有value值均为NA时,sum(value, na.rm = TRUE)会返回0,不符合需求。我们可以通过判断组内是否全部为NA来调整求和逻辑,实现全NA组返回NA、其他组正常求和的效果。
方法一:使用if_else结合all(is.na(value))判断
这是最直观的写法,先判断组内是否全为NA,再决定返回NA还是求和结果:
library(dplyr) dat <- data.frame(id = rep(c(1,2,3,4), each = 3), value = c(NA, NA, NA, 0, 1, 2, 0, 1, NA, 1, 2,3)) dat %>% group_by(id) %>% summarise( value_sum = if_else( condition = all(is.na(value)), true = NA_real_, # 必须用数值型NA,避免类型不匹配 false = sum(value, na.rm = TRUE) ) )
方法二:利用na.rm参数的动态设置
通过!all(is.na(value))动态控制na.rm的值,当全NA时na.rm=FALSE,sum会返回NA;否则正常求和:
dat %>% group_by(id) %>% summarise( value_sum = sum(value, na.rm = !all(is.na(value))) )
方法三:使用if_all(dplyr 1.0.0及以上版本支持)
if_all可以更简洁地判断列中所有元素是否满足条件:
dat %>% group_by(id) %>% summarise( value_sum = if_else( if_all(value, is.na), NA_real_, sum(value, na.rm = TRUE) ) )
执行后输出结果
# A tibble: 4 × 2 id value_sum <dbl> <dbl> 1 1 NA 2 2 3 3 3 1 4 4 6
内容的提问来源于stack exchange,提问作者89_Simple
相关产品推荐
相关产品推荐

