R语言IO表行业聚合求助:合并16、17行业为16T17
高效处理多国家投入产出表行业合并问题
核心需求
将含多国家、多行业的投入产出(IO)表中,所有国家的16、17行业合并为新行业16T17,需同时完成行聚合(合并对应行业的行数据)和列聚合(合并对应行业的列数据),且方案需适配大规模数据(如100个国家、10个行业)。
原始数据与目标示例
原始IO表结构(以2国4行业为例):
df=data.frame(industry=c("DEU_10T12","DEU_13T15","DEU_16","DEU_17","ITA_10T12", "ITA_13T15","ITA_16","ITA_17"),DEU_10T12=c(20,24,26,20,10,0,NA,1.5), DEU_13T15=c(15,16,4.5,NA,7.5,5,3,0),DEU_16=c(1.5,6,4,0,0.5,15,3,0.5), DEU_17=c(NA,20,10,2,0,0,0,7), ITA_10T12=c(0.5,2,3,4,10,50,2,15), ITA_13T15=c(25,0,4.5,NA,17.5,5,13,0.9), ITA_16=c(2,3,40,20,0.5,15,3,1), ITA_17=c(1,9,0.5,2,10,20,50,7))
目标输出(合并16、17行业后):
df2=data.frame(industry=c("DEU_10T12","DEU_13T15","DEU_16T17","ITA_10T12","ITA_13T15","ITA_16T17"), DEU_10T12=c(20,24,46,10,0,1.5),DEU_13T15=c(15,16,4.5,7.5,5,3),DEU_16T17=c(1.5,26,16,0.5,15,10.5), ITA_10T12=c(0.5,2,7,10,50,17),ITA_13T15=c(25,0,4.5,17.5,5,13.9), ITA_16T17=c(3,12,62.5,10.5,35,61))
原代码问题分析
原代码仅手动处理了部分列的聚合,未完成行的聚合,且硬编码国家/行业名称,无法适配大规模数据,效率极低。
高效实现方案(基于tidyverse)
利用tidyverse的批量处理能力,无需硬编码国家/行业,自动完成行和列的双向聚合:
library(tidyverse) # 1. 处理行聚合:拆分行业标识,合并16/17行业,按新分组求和 row_agg <- df %>% separate(industry, into = c("country", "sector"), sep = "_", remove = FALSE) %>% mutate(sector = case_when( sector %in% c("16", "17") ~ "16T17", TRUE ~ sector )) %>% group_by(country, sector) %>% summarise(across(-industry, ~sum(., na.rm = TRUE))) %>% unite(industry, country, sector, sep = "_") %>% ungroup() # 2. 处理列聚合:转置后重复行聚合逻辑,再转置回原结构 col_agg <- row_agg %>% pivot_longer(-industry, names_to = "col_name", values_to = "value") %>% separate(col_name, into = c("col_country", "col_sector"), sep = "_") %>% mutate(col_sector = case_when( col_sector %in% c("16", "17") ~ "16T17", TRUE ~ col_sector )) %>% group_by(industry, col_country, col_sector) %>% summarise(value = sum(value, na.rm = TRUE)) %>% unite(col_name, col_country, col_sector, sep = "_") %>% pivot_wider(names_from = col_name, values_from = value) %>% ungroup() # 最终结果 final_df <- col_agg
代码说明
行聚合:
- 拆分
industry列得到国家和行业代码 - 将16、17行业统一替换为16T17
- 按国家+新行业分组,对所有数值列求和(自动忽略NA)
- 重新合并为
industry列
- 拆分
列聚合:
- 将行聚合后的表转置为长格式,便于处理列名
- 对列名执行和行相同的拆分、合并逻辑
- 按原行标识+新列分组求和,再转置回宽格式
结果验证
运行代码后,final_df的结构和数值将完全匹配目标df2,且该方案可直接适配100个国家、10个行业的大规模数据,无需修改代码。
内容的提问来源于stack exchange,提问作者Maximilian
相关产品推荐
相关产品推荐

