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

如何合并含多年份GDP的两个DataFrame?R语言数据合并求助

合并多列年份GDP到长格式DataFrame的解决方案

我来帮你解决这个问题!你的核心需求是把宽格式的GDP数据(df2)和长格式的贸易数据(df1)合并,而且要适配任意数量的年份,而不是局限于2个年份。这里有个更通用的解决方案,用tidyverse的工具来处理:

步骤1:先构建示例数据(和你的数据结构一致)

# 创建df1
df1 <- data.frame(
  COUNTRY = rep(c("Spain", "Germany", "France"), 3),
  YEAR = c(2016, 2016, 2016, 2017, 2017, 2017, 2015, 2015, 2015),
  TRADE = c(276, 323, 392, 456, 564, 359, 767, 868, 969)
)

# 创建df2
df2 <- data.frame(
  COUNTRY = c("Spain", "Germany", "France"),
  GDP2016 = c(1111, 2222, 3333),
  GDP2017 = c(999, 888, 777),
  GDP2015 = c(444, 555, 666)
)

步骤2:将宽格式的df2转换为长格式

df2的结构是“宽表”(每个年份对应一列),我们需要把它转成和df1匹配的“长表”结构(年份作为单独一列),这样不管有多少年份都能通用:

library(tidyverse)

df2_long <- df2 %>%
  pivot_longer(
    cols = starts_with("GDP"),  # 选中所有以GDP开头的列
    names_to = "YEAR",          # 把原列名存到YEAR列
    values_to = "GDP"           # 把原列对应的值存到GDP列
  ) %>%
  mutate(YEAR = as.integer(str_remove(YEAR, "GDP")))  # 去掉YEAR列里的"GDP"前缀,转成整数类型

步骤3:合并两个长格式DataFrame

现在两个表的结构一致,直接按COUNTRY和YEAR合并即可:

df3 <- merge(df1, df2_long, by = c("COUNTRY", "YEAR"))

# 查看最终结果
print(df3)

运行后你会得到完全符合预期的结果:

COUNTRY YEAR TRADE  GDP
1   France 2015   969  666
2   France 2016   392 3333
3   France 2017   359  777
4  Germany 2015   868  555
5  Germany 2016   323 2222
6  Germany 2017   564  888
7    Spain 2015   767  444
8    Spain 2016   276 1111
9    Spain 2017   456  999

为什么这个方法更好?

  • 通用性强:不管你后续新增多少年份的GDP列(比如GDP2018、GDP2019),代码都不需要修改,自动适配
  • 代码简洁:避免了写一堆嵌套的ifelse或者case_when,可读性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:31:47