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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:33:24