You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码说明

  1. 行聚合:

    • 拆分industry列得到国家和行业代码
    • 将16、17行业统一替换为16T17
    • 按国家+新行业分组,对所有数值列求和(自动忽略NA)
    • 重新合并为industry列
  2. 列聚合:

    • 将行聚合后的表转置为长格式,便于处理列名
    • 对列名执行和行相同的拆分、合并逻辑
    • 按原行标识+新列分组求和,再转置回宽格式

结果验证

运行代码后,final_df的结构和数值将完全匹配目标df2,且该方案可直接适配100个国家、10个行业的大规模数据,无需修改代码。

内容的提问来源于stack exchange,提问作者Maximilian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:05:36