如何在R循环中将多雨量站时间序列计算结果保存到数据框?
问题
我拥有多个雨量站的日降雨时间序列(按列存储),正在计算年指数(如年总降水量PRCPTOT)。我通过循环生成了每个雨量站的年总值序列,需要将各雨量站的计算结果保存到对应的数据框中,请问该如何实现?
现有代码
library(precintcon) library(reshape2) library(plyr) # 创建示例数据框(使用precintcon包) 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') head(df) # 循环处理 ncol(df) nproc = 4 cont = 1 # 存储结果的数据框 dfr = data.frame(variavel = character(nproc), SPI = numeric(nproc), stringsAsFactors = F) # i = 2 for (i in 2:5) { print(i) df2<-df[,-c(2,3)] nome.var=colnames(df2[i]) variavela = nome.var[1] dfr$variavel[cont] = variavela TIM = TIM[,c(1,2,i)] TIM = na.omit(TIM) names(TIM) = c("Year","Month","Cd") head(TIM) df2=TIM # 此处计算年尺度SPI(标准化降水指数) # 希望将各列雨量站的结果保存到同一个表格中(见下方示例) names(df2)[1] <- "year" names(df2)[2] <- "month" names(df2)[3] <- "precipitation" df2=as.monthly(df2) head(df2) SPI=spi.per.year(df2, period = 12);SPI cont = cont + 1 } # 保存结果 library(writexl) write_xlsx(dfr, "Results.xlsx")
期望结果

解决方案
1. 调整结果存储逻辑
原代码的结果数据框结构不符合需求,我们需要创建以年份为行、雨量站为列的结构,确保每个站点的年指数能按年份对齐存储。
2. 完整修正代码
library(precintcon) library(reshape2) library(plyr) library(writexl) # 加载示例数据并处理格式 data("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') # 提取所有雨量站列名,避免硬编码索引 gauge_cols <- colnames(df)[4:7] # 获取所有唯一年份,作为结果的基础行 all_years <- unique(df$year) # 初始化结果数据框 result_df <- data.frame(Year = all_years, stringsAsFactors = FALSE) # 循环处理每个雨量站 for (gauge in gauge_cols) { # 提取当前雨量站的日降水数据,保留年、月、日和降水列 current_df <- df[, c("year", "month", "day", gauge)] colnames(current_df)[4] <- "precipitation" # 转换为月尺度数据 monthly_df <- as.monthly(current_df) # 计算年尺度SPI spi_result <- spi.per.year(monthly_df, period = 12) # 将当前站点的SPI结果合并到总数据框,按年份匹配 result_df <- merge(result_df, spi_result[, c("year", "spi")], by.x = "Year", by.y = "year", all.x = TRUE) # 重命名列对应雨量站名称 colnames(result_df)[ncol(result_df)] <- gauge } # 查看最终结果 head(result_df) # 保存到Excel文件 write_xlsx(result_df, "Annual_SPI_Results.xlsx")
代码说明
- 先提取所有雨量站列名,避免硬编码索引导致的错误
- 以数据中所有唯一年份为基础初始化结果框,确保后续各站点结果能按年份对齐
- 循环中对每个站点单独处理:提取数据→转月尺度→计算年SPI→合并到总结果
- 使用
merge函数保证年份匹配,避免因部分站点缺失年份数据导致的错位
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

