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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:03:24