R语言dplyr包使用summarize函数计算mean时参与计算的数值数量问题
R dplyr summarise 计算均值时统计有效参与运算的样本量
实现思路
你开启na.rm = TRUE计算均值时,实际参与运算的数值为对应列的非NA值,统计这些值的数量即可得到目标结果,以下提供两种常用实现方案:
1. 新版dplyr(1.0.0及以上,推荐)
使用across批量处理所有数值列,可同时输出均值和对应的有效样本量:
library(dplyr) result <- df %>% group_by(x) %>% summarise( across(where(is.numeric), list( mean = ~mean(.x, na.rm = TRUE), valid_n = ~sum(!is.na(.x)) ), .names = "{.col}_{.fn}" ) )
输出结果说明:
- 每个原始数值列会生成两个新列,后缀
_mean为计算得到的均值,后缀_valid_n为该列在对应分组中实际参与均值计算的非NA值数量 - 如需统计所有数值列的总参与运算数量,可通过以下代码计算:
total_count <- result %>% ungroup() %>% summarise(total = sum(c_across(ends_with("_valid_n")))) %>% pull(total)
2. 兼容旧版dplyr的summarise_if写法
如果你习惯使用旧式的summarise_if语法,可以用以下写法实现相同效果:
result <- df %>% group_by(x) %>% summarise_if( is.numeric, list( mean = ~mean(.x, na.rm = TRUE), valid_n = ~sum(!is.na(.x)) ) )
注意事项
不要用n()统计参与运算的数量,n()返回的是分组的总行数,包含带NA值的行,统计结果会比实际参与均值计算的数量大。
内容的提问来源于stack exchange,提问作者ghs101
相关产品推荐
相关产品推荐

