如何在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) }
为什么这样改?
- 用
select(all_of(output_columns))替代原有的索引方式,更符合dplyr现代语法,可读性更强; group_by(across(all_of(criteria)))是dplyr推荐的分组写法,比旧版的group_by_更直观;- 在
summarize里,我们先用across处理数值列求和,再直接用count = n()生成计数列——n()是dplyr专门用来统计每组观测数的函数,比tally()更灵活,因为可以和其他汇总操作一起执行; .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
相关产品推荐
相关产品推荐

