在R中按多分组合并汇总数据的高效实现方法
R中高效合并人口数据框的方法
直接用dplyr结合tidyr的分组聚合+格式转换就能一次性完成需求,完全不用手动拆分数据框,步骤如下:
核心思路
通过按地区(region)和类型(type)分组,直接对所有年份列求和,自动完成性别(gender)和年龄组的合并汇总;再通过格式转换将type转为独立列,得到目标样式。
完整代码示例
1. 加载依赖包
library(dplyr) library(tidyr)
2. 模拟示例数据(可替换为你的真实数据)
set.seed(123) df <- expand.grid( region = rep(c("city1", "city2", "city3"), each = 12), # 每个城市3个年龄组,每组4条记录 age_group = rep(c("18-25", "26-40", "41-60"), each = 4, times = 3), gender = rep(c("male", "female"), each = 2, times = 9), type = rep(c("A", "B"), times = 18), year_2020 = sample(100:500, 36), year_2021 = sample(100:500, 36), year_2022 = sample(100:500, 36) )
3. 数据合并与格式整理
# 第一步:分组汇总(合并性别、年龄组,保留type区分) summary_df <- df %>% group_by(region, type) %>% summarise(across(starts_with("year_"), sum), .groups = "drop") # 第二步:将type转为额外列,生成最终格式 final_df <- summary_df %>% pivot_wider( names_from = type, values_from = starts_with("year_"), names_sep = "_" )
代码说明
group_by(region, type):指定分组维度,确保同一地区、同一类型的所有数据(不同性别、年龄组)被归为一组summarise(across(starts_with("year_"), sum)):对所有年份列批量求和,自动完成性别和年龄组的合并,无需手动筛选pivot_wider:将type从行维度转换为列维度,生成如year_2020_A、year_2020_B的列,符合后续处理需求
这种方法的优势:
- 完全避免手动拆分数据框的繁琐操作
- 向量化运算效率高,大数据量下比循环/手动拆分快很多
- 代码逻辑清晰,可读性强,便于后续修改维护
内容的提问来源于stack exchange,提问作者flâneur
相关产品推荐
相关产品推荐

