在循环R

时间:2017-06-15 16:10:06

标签: r list

假设我有10个型号,我在两个站点运行。站点1的日常数据为三年,站点2为四年。为了运行模型性能的统计数据,我循环遍历模型和站点:

require(hydroGOF)
df <- NULL
model <- list()


dateO <- list(seq(as.POSIXct("2012-01-01"), as.POSIXct("2014-12-31"), by="day"),
             seq(as.POSIXct("2012-01-01"), as.POSIXct("2015-12-31"), by="day"))

obs <- list(sample(0:100,1096,replace=TRUE),
           sample(0:100,1461,replace=TRUE))

var <- list()
for (i in 1:10) {
   model[[i]] <- list()
   model[[i]][[1]] <- sample(0:100,1096,replace=TRUE)
   model[[i]][[2]] <- sample(0:100,1461,replace=TRUE)
   for (j in 1:2) {
      rmseS=rmse(model[[i]][[j]],obs[[j]],na.rm=TRUE)
      rbind(df,rmseS) -> df
    }
}

使用上面的代码,我可以计算总RMSE,但我想要的是计算年度RMSE。我了解ggof包中的hydroGOF可以计算年度,月度等统计信息,但我必须彻底重新格式化我的数据。有没有办法可以使用dateO列表来计算年度RMSE,并且每个站点的年份不同会增加复杂性?我希望能够在数据框中编写我的数据,这就是为什么我rbind在我的代码中,具有站点名称和模型名称,理想情况下,多年以后,结果将如下所示:< / p>

RMSE  Site   Model    Year
0.4   Site1  Model1   2012
0.3   Site1  Model1   2013
0.4   Site1  Model2   2012

依旧......

1 个答案:

答案 0 :(得分:1)

我确实设法做了我想做的事情,但使用的方法与上面提到的略有不同(我只是选择了有效的方法......)。我必须在数据帧中写入所有数据,然后计算循环外的rmse,如下:

for (i in 1:10) { # Loop over models

   model[[i]] <- list()
   model[[i]][[1]] <- sample(0:100,1096,replace=TRUE)
   model[[i]][[2]] <- sample(0:100,1461,replace=TRUE)
   for (j in 1:2) { # Loop over sites
       year=as.numeric(format(dateO[[j]][length(dateO[[j]])],"%Y"))
       # Loop over days.
       for (k in 1:length(dateO[[j]])){
       # Create a data frame with the vars needed to calculate yearly RMSE.
       df <- rbind(df,data.frame(as.character(i),as.character(j),
                                  model[[i]][[j]][[k]],obs[[j]][[k]],year))
       }
   }
}
colnames(df) <- c("Model_number","Site_number","Model_value","Obs_value","Year")
newdf <- df %>% group_by(Year,Site_number,Model_number) %>% summarise(RMSE=rmse(Model_value,Obs_value,na.rm=TRUE))