如何用dplyr实现分组后同时获取分组统计与订单级汇总?
问题:使用dplyr同时计算分组统计与订单级汇总值
需求:在使用dplyr进行分组操作时,需同时计算两类统计值并在同一视图展示:
- 基于
order和type两个变量的分组统计值total_by_order_type(每组的记录数) - 基于单个变量
order的订单级汇总值total_by_order(对应订单下所有total_by_order_type的总和)
当前代码与问题
当前使用的代码:
view(df %>% group_by(order, type) %>% summarize(total_by_order_type = n(), total_by_order = n()) )
当前输出结果:
| order | type | total_by_order_type | total_by_order |
|---|---|---|---|
| 1 | A | 5 | 5 |
| 1 | B | 7 | 7 |
| 2 | A | 2 | 2 |
| 3 | A | 10 | 10 |
| 3 | B | 6 | 6 |
问题:total_by_order列错误地使用了当前order+type分组的记录数,而非整个订单的总和。
解决方案
方法1:分步分组汇总
先按order+type分组计算total_by_order_type,再保留order分组计算订单总和:
df %>% group_by(order, type) %>% summarize(total_by_order_type = n(), .groups = "drop_last") %>% mutate(total_by_order = sum(total_by_order_type)) %>% ungroup() %>% view()
方法2:使用窗口函数(dplyr 1.1.0+)
直接在summarize中通过.by参数指定订单级别的求和,无需额外分组:
df %>% group_by(order, type) %>% summarize( total_by_order_type = n(), total_by_order = sum(n(), .by = order) ) %>% ungroup() %>% view()
正确输出结果
| order | type | total_by_order_type | total_by_order |
|---|---|---|---|
| 1 | A | 5 | 12 |
| 1 | B | 7 | 12 |
| 2 | A | 2 | 2 |
| 3 | A | 10 | 16 |
| 3 | B | 6 | 16 |
内容的提问来源于stack exchange,提问作者Marcello_lewis
相关产品推荐
相关产品推荐

