You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:15:06