如何在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
相关产品推荐
相关产品推荐

