使用dplyr生成按站点及子类别汇总统计表格的技术问题
解决方案:用dplyr生成包含站点总计与子类别统计的表格
需求说明
需要生成以站点(site)为行的统计表格,包含两类统计:
- 站点全数据集的
total_count(总数)与Mean_per_litre(每升均值) - 站点下各子类别
f_grp对应的total_count(子类别的总数),且均值沿用站点全数据集的均值(而非子类别的子集均值)
实现代码
library(dplyr) library(tidyr) # 统一处理数据类型 dat <- dat %>% mutate( site = as.factor(site), count = as.numeric(count), f_grp = as.factor(f_grp) ) # 1. 计算每个站点的总计统计 site_totals <- dat %>% group_by(site) %>% summarise( total_count = sum(count, na.rm = TRUE), Mean_per_litre = mean(count_l_site, na.rm = TRUE) ) # 2. 计算每个站点下各f_grp的total_count,并转为宽格式 fg_totals <- dat %>% group_by(site, f_grp) %>% summarise( fg_total_count = sum(count, na.rm = TRUE) ) %>% pivot_wider( names_from = f_grp, values_from = fg_total_count, names_prefix = "total_count_" ) # 3. 合并结果并调整列顺序,确保总计列前置 final_table <- site_totals %>% left_join(fg_totals, by = "site") %>% select( site, total_count, Mean_per_litre, starts_with("total_count_") ) final_table
代码说明
- 站点总计计算:按
site分组,统计全站点的count总和与count_l_site均值,加入na.rm = TRUE避免因缺失值导致计算错误。 - 子类别统计转宽:按
site和f_grp分组统计子类别的count总和,通过pivot_wider将子类别转为列,自动生成带前缀的列名(如total_count_1b),避免列名混乱。 - 合并与列序优化:用
left_join合并总计与子类别数据,通过select强制将总计列放在最前面,子类别列依次跟随,保证表格结构清晰、符合阅读习惯。
最终表格结构示例
| site | total_count | Mean_per_litre | total_count_1b | total_count_1c | total_count_1d | ... |
|---|---|---|---|---|---|---|
| 1 | 120 | 2.4 | 45 | 30 | 25 | ... |
| 2 | 98 | 1.96 | 28 | 32 | 18 | ... |
每个站点单独一行,总计列前置,同时清晰展示各子类别总数,均值统一使用站点全数据集的计算结果,完全匹配需求。
内容的提问来源于stack exchange,提问作者Bramble95
相关产品推荐
相关产品推荐

