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

如何在R中合并多份含不同年份气温的data.frame构建新数据集?

嗨,这个场景太典型了——处理多年份的站点观测数据,手动拼接35份文件绝对是噩梦!用dplyr+tidyr+purrr的组合完全能自动化搞定,我给你两种实用方案,选你觉得顺手的来:

假设前提

先确认下你的单份数据结构:每份data.frame都包含唯一标识列(比如Station_ID)、坐标列(Lon/Lat)、年度气温列(Annual_Temp),且所有数据里的站点信息完全匹配。


方案一:先转长表再转宽表(直观不易出错)

这种方法先把所有数据整合成一份长格式表,再一键转成你要的宽格式,自动生成年份对应的气温列。

步骤代码:

# 加载需要的包
library(dplyr)
library(purrr)
library(tidyr)
library(stringr)

# 1. 批量获取所有年份的data.frame到列表里
# 假设你的数据命名规律是temp_2000、temp_2001...temp_2034,用正则匹配批量抓取
temp_list <- mget(ls(pattern = "^temp_\\d{4}$"))

# 2. 从列表元素的名字里提取年份(比如从"temp_2000"提取"2000")
year_names <- str_remove(names(temp_list), "^temp_")

# 3. 把所有数据绑定成一张长表,同时添加年份标识列
long_data <- map2_dfr(temp_list, year_names, ~ .x %>% mutate(Year = .y))

# 4. 转成宽格式,自动生成带年份后缀的气温列
final_df <- long_data %>%
  pivot_wider(
    id_cols = c(Station_ID, Lon, Lat),  # 保留的固定列
    names_from = Year,                 # 用来生成新列名的字段
    values_from = Annual_Temp,         # 要扩展的数值字段
    names_prefix = "Annual_Temp_"      # 新列名的前缀,比如Annual_Temp_2000
  )

方案二:批量重命名列后逐表合并

如果习惯直接操作列名,也可以先给每份数据的气温列加上年份后缀,再依次合并所有表。

步骤代码:

# 加载需要的包
library(dplyr)
library(purrr)
library(stringr)

# 1. 同样批量获取数据到列表
temp_list <- mget(ls(pattern = "^temp_\\d{4}$"))
year_names <- str_remove(names(temp_list), "^temp_")

# 2. 给每份数据的Annual_Temp列重命名为"Annual_Temp_年份"
# 这里用了dplyr的动态命名语法(!!和:=)来生成动态列名
temp_list_renamed <- map2(temp_list, year_names, ~ .x %>% 
                           rename(!!paste0("Annual_Temp_", .y) := Annual_Temp))

# 3. 依次合并所有表,基于站点标识和坐标列
final_df <- temp_list_renamed %>%
  reduce(left_join, by = c("Station_ID", "Lon", "Lat"))

注意事项

  • 如果你的数据命名没有规律(不是temp_YYYY这种),可以手动创建列表:temp_list <- list(year2000 = df2000, year2001 = df2001, ...),只要列表元素的名字是年份就行。
  • 确保所有数据里的站点标识、坐标完全一致,否则合并后会出现NA值或不匹配的情况。如果有缺失值,合并后对应位置会显示NA,这是正常的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:50:11