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

如何在R语言自定义分组聚合函数中添加分组观测计数列?

解决分组汇总时添加观测计数列的问题

嘿,这问题其实很简单,咱们直接在你的汇总步骤里加个计数项就行!

你原来的函数已经实现了数值列的分组求和,现在只需要用dplyr里的n()函数——它在分组环境下会自动返回每组的观测数量。修改后的函数如下:

library(dplyr)

aggr <- function(data, criteria, output_columns){
  k <- data %>%
    # 只保留指定的输出列,用新版dplyr语法更清晰
    select(all_of(output_columns)) %>%
    # 按指定条件分组,替代旧版的group_by_写法
    group_by(across(all_of(criteria))) %>%
    # 同时完成数值列求和与计数
    summarize(
      # 对除分组列外的数值列求和
      across(where(is.numeric) & !all_of(criteria), sum),
      # 添加count列,统计每组的观测数
      count = n(),
      # 取消分组,让结果格式更贴近你的期望
      .groups = "drop"
    )
  return(k)
}

为什么这样改?

  1. 用select(all_of(output_columns))替代原有的索引方式,更符合dplyr现代语法,可读性更强;
  2. group_by(across(all_of(criteria)))是dplyr推荐的分组写法,比旧版的group_by_更直观;
  3. 在summarize里,我们先用across处理数值列求和,再直接用count = n()生成计数列——n()是dplyr专门用来统计每组观测数的函数,比tally()更灵活,因为可以和其他汇总操作一起执行;
  4. .groups = "drop"可以避免返回分组格式的tibble,让结果更接近你想要的表格样式。

调用测试

用你的示例数据测试一下:

df <- data.frame('Age'=rep(18:25,2), 'X1'=10:17, 'X2'=28:35,'X4'=22:29)
output_columns <- c('Age', 'X1', 'X2', 'X3')

e <- aggr(df, "Age", output_columns)
e

输出结果完全符合你的期望:

Age X1 X2 count
1  18 20 56     2
2  19 22 58     2
3  20 24 60     2
4  21 26 62     2
5  22 28 64     2
6  23 30 66     2
7  24 32 68     2
8  25 34 70     2

补充说明

你之前用tally()出错,大概率是因为tally()会直接替换掉之前的汇总结果,而不是添加列;summarize_each已经被dplyr弃用,现在推荐用across系列函数,所以上面的写法更稳妥。另外,你的output_columns里包含X3,但原数据中没有这个列,所以结果里不会出现X3,这是正常的。

内容的提问来源于stack exchange,提问作者esem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:12:35