如何在R中批量处理含多工作表的多份Excel气象数据文件
批量处理气象站Excel文件的R语言解决方案
针对你的需求,我们可以把单个文件的处理逻辑封装成可复用的函数,再通过遍历文件夹中的所有Excel文件实现批量处理。以下是优化后的完整方案:
关键优化点
- 把重复的单文件处理逻辑封装成函数,避免冗余代码
- 用列表存储中间结果替代
assign,更高效且避免环境变量混乱 - 简化月份数据整理逻辑,不用手动逐个创建月份数据框
- 自动遍历目标文件夹中的所有气象站Excel文件
完整代码
# 安装并加载所需包 install.packages(c("readxl", "dplyr", "tidyr")) library(readxl) library(dplyr) library(tidyr) # 定义处理单个气象站文件的函数 process_station <- function(file_path, years = 2008:2021) { # 存储每个年份的数据 year_data_list <- list() for (year in years) { # 读取当前年份的工作表 raw_data <- read_excel(file_path, range = "A7:AK38", .name_repair = tolower, sheet = as.character(year)) # 重命名第一列为Day colnames(raw_data)[1] <- "day" # 构建月份与对应列索引的映射 month_col_mapping <- tibble( month = 1:12, tmin_col = seq(2, 37, by = 3), tmax_col = seq(3, 38, by = 3), tmean_col = seq(4, 39, by = 3) ) # 循环处理每个月份的数据 monthly_data_list <- lapply(1:nrow(month_col_mapping), function(m) { map_row <- month_col_mapping[m, ] tibble( Month = map_row$month, Day = raw_data$day, Tmin = raw_data[[map_row$tmin_col]], Tmax = raw_data[[map_row$tmax_col]], Tmean = raw_data[[map_row$tmean_col]] ) }) # 合并所有月份数据,添加年份列并整理格式 yearly_data <- bind_rows(monthly_data_list) %>% mutate(Year = year) %>% rename(Tmin = min, Tmax = max, Tmean = avg) %>% mutate(Date = as.Date(paste(Year, Month, Day, sep = "-"))) %>% filter(!is.na(Date)) %>% mutate(Prec = NA) %>% select(Date, Year, Month, Day, Tmin, Tmax, Tmean, Prec) # 将当前年份数据加入列表 year_data_list[[as.character(year)]] <- yearly_data } # 合并所有年份的数据 full_station_data <- bind_rows(year_data_list) return(full_station_data) } # 设置目标文件夹路径(替换为你的实际路径) station_folder <- "D:/Chill R Tutorial/ChillR-basic/AllBasin/" # 获取文件夹中所有Excel文件的路径 station_files <- list.files(station_folder, pattern = "\\.xlsx$", full.names = TRUE) # 批量处理所有文件并保存结果 for (file in station_files) { # 处理当前文件 station_data <- process_station(file) # 生成输出文件名(原文件名替换为_Obs.csv) output_filename <- gsub("\\.xlsx$", "_Obs.csv", basename(file)) output_path <- file.path(station_folder, output_filename) # 保存结果 write.csv(station_data, output_path, row.names = FALSE) cat("已完成处理:", output_filename, "\n") }
代码说明
- 函数封装:
process_station函数接收文件路径和年份范围,返回该气象站的完整处理后数据 - 月份数据简化:通过列索引映射循环处理12个月,替代原代码中手动创建12个数据框的冗余操作
- 批量遍历:用
list.files获取所有Excel文件,循环调用处理函数并自动保存结果 - 格式匹配:确保输出列顺序、命名规则与你单个文件处理的结果完全一致
注意事项
- 确保所有气象站的Excel文件格式与
Lashkargah_AT .xlsx完全一致(工作表命名、数据范围、列顺序) - 若年份范围需要调整,修改
process_station函数的years参数即可 - 输出文件会保存在原文件夹中,文件名格式为
[原文件名]_Obs.csv
内容的提问来源于stack exchange,提问作者Atifullah Shinwari
相关产品推荐
相关产品推荐

