如何合并含多年份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
相关产品推荐
相关产品推荐

