R语言中合并数据框指定行数据以构建人口年龄金字塔
解决方法
你可以通过重新归类年龄组,再按性别和新的年龄组聚合人口数的方式实现,无需手动选择行操作。以下提供两种常用方案:
方案一:使用 tidyverse 工具链(推荐)
利用 forcats 包的 fct_collapse 函数直接合并因子水平,再用 dplyr 聚合求和:
# 加载所需包 library(tidyverse) # 合并指定年龄组并聚合 pop_pyramid_clean <- pop_pyramid %>% mutate( # 合并非标准年龄组到目标5年组 Age_group_clean = fct_collapse(Age_group, "15" = c("15", "18"), "20" = c("20", "21", "22"), "60" = c("60", "62"), "65" = c("65", "67") ) ) %>% group_by(Sex, Age_group_clean) %>% summarise(pop = sum(pop), .groups = "drop")
方案二:Base R 实现
无需额外包,通过创建映射关系完成归类后聚合:
# 创建年龄组映射:键为原组,值为目标组 age_map <- c("18" = "15", "21" = "20", "22" = "20", "62" = "60", "67" = "65") # 生成新的年龄组列 pop_pyramid$Age_group_clean <- ifelse( as.character(pop_pyramid$Age_group) %in% names(age_map), age_map[as.character(pop_pyramid$Age_group)], as.character(pop_pyramid$Age_group) ) # 按性别和新年龄组聚合求和 pop_pyramid_clean <- aggregate(pop ~ Sex + Age_group_clean, data = pop_pyramid, sum) # 可选:将新年龄组转回因子类型 pop_pyramid_clean$Age_group_clean <- as.factor(pop_pyramid_clean$Age_group_clean)
说明
两种方案的核心逻辑一致:先将非标准年龄组重新归类到对应的5年组,再按性别和新组汇总人口数。这样既避免了手动操作行的繁琐,也能自动处理所有符合规则的分组,不会因因子类型导致错误。
内容的提问来源于stack exchange,提问作者Jim Milks
相关产品推荐
相关产品推荐

