如何在R中将多雨量站年度SPI循环结果保存为数据框?
多雨量站年度SPI计算结果的保存方案
现有按列存储的多雨量站日降雨量时间序列,需计算年度标准化降水指数(SPI)并保存为年份为行、各雨量站SPI为列的表格格式,但原循环代码的保存方法无效,无法得到目标格式。
原代码核心问题
- 结果数据框
dfr结构设计错误,仅存储了雨量站名称和单个SPI值,未按年份拆分所有年度结果 - 循环内重复加载
writexl包,且每次循环都写入文件,最终仅保留最后一次循环的不完整结果 - 代码中
TIM对象未定义,逻辑上应基于输入的df数据处理
修正后的完整代码
library(precintcon) library(reshape2) library(plyr) library(writexl) # 构造示例数据(基于precintcon的daily数据集) df <- melt(daily, id = c("year", "month")) df$value2 <- df$value; df$value3 <- df$value; df$value4 <- df$value colnames(df) <- c('year', 'month', 'day', 'RainGaue1', 'RainGaue2', 'RainGaue3', 'RainGaue4') # 初始化结果列表,存储每个雨量站的年度SPI spi_results_list <- list() # 遍历每个雨量站(第4到第7列为各站降雨数据) for (i in 4:ncol(df)) { # 获取当前雨量站名称 gauge_name <- colnames(df)[i] # 提取当前站的日数据,清理缺失值后转月度数据 gauge_data <- df[, c("year", "month", i)] colnames(gauge_data) <- c("year", "month", "precipitation") gauge_data <- na.omit(gauge_data) monthly_data <- as.monthly(gauge_data) # 计算年度SPI(period=12代表基于12个月累积降水计算) spi_result <- spi.per.year(monthly_data, period = 12) # 整理结果:保留年份和SPI值,并重命名SPI列为雨量站名称 spi_result <- spi_result[, c("year", "spi")] colnames(spi_result)[2] <- gauge_name # 将当前站的结果存入列表 spi_results_list[[gauge_name]] <- spi_result } # 合并所有站的结果:按年份对齐,生成目标格式的宽表 final_spi_df <- Reduce(function(x, y) merge(x, y, by = "year", all = TRUE), spi_results_list) # 保存完整结果到Excel write_xlsx(final_spi_df, "年度SPI结果.xlsx")
关键逻辑说明
- 用列表存储每个雨量站的年度SPI结果,避免循环中数据被覆盖
- 每个站的结果单独整理为
年份-对应站SPI的小数据框,方便后续合并 - 通过
Reduce(merge)将所有小数据框按年份对齐,自动生成「年份为行、各站SPI为列」的目标表格 - 仅在循环结束后执行一次保存操作,确保所有结果都被写入文件
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

