1

这是与此相关的问题: Better way to optimize my code for getting NOAA climate data

但由于不同的数据集以及完全不同的“for”循环格式,我认为最好开始一个新问题。本质上,我试图从 NOAA 的 GSOM 数据集中获取数据(特别是度日、降水、温度、所有月平均值)。我需要从 2005 年到 2015 年的这些数据,并且一直在使用 rnoaa 包来访问和下载信息。

到目前为止,新循环是这样的:

    library(rnoaa)
options(noaakey = "your api code key here")
states<-ncdc_locs(locationcategoryid='ST', limit=52)
locat <- states$data$id[states$data$name=="Florida"]
month<-seq.Date(as.Date("2005/1/1"),as.Date("2015/12/31"), by="month" )
vmonth<-as.character(month)
#### Precipitation
datatype <- "PRCP"
dataPRCP <- array(0,c(0,length(vmonth)+3))
colnames(dataPRCP) <- c("Station","Latitude", "Longitude", vmonth)
emptyrow<-rep(NA,length(vmonth)+3)
for (i in 1:length(vmonth)){ 
  my.query<-ncdc(datasetid='GSOM',datatypeid = datatype, locationid = location, startdate = vmonth[i], enddate = vmonth[i], limit = 1000)

  for (j in 1:length(my.query$data$value)){
    if(my.query$data$station[j] %in%  dataPRCP[,1]){
      rowNum<-which(dataPRCP[,1]==my.query$data$station[j])
      dataPRCP[rowNum,i+3]<-my.query$data$value[j]
    } else {
      dataPRCP<-rbind(dataPRCP,emptyrow)
      rowNum<-length(dataPRCP[,1])
      location <- ncdc_stations(stationid = my.query$data$station[j])
      dataPRCP[rowNum,1]<-my.query$data$station[j]
      dataPRCP[rowNum,2]<-location$data$latitude
      dataPRCP[rowNum,3]<-location$data$longitude
      dataPRCP[rowNum,i+3]<-my.query$data$value[j]
    }
  }}
rownames(dataPRCP) <- c(1:length(dataPRCP[,1]))

我之前曾被告知其他可以简化和优化“for”循环的软件包,例如 dplyer 或 purrr,但是如何利用这些软件包或任何其他方式优化像这样的更复杂的“for”循环(包含 if/else)?

我想补充的最后一件事是,当我运行循环时,我收到一个错误/警告:此外:警告消息:错误:(429) - 此令牌已达到其每秒 5 次的临时请求限制。

这是因为它们只允许您每秒发出 5 个请求,这意味着我从 rnoaa 获得的可能是不完整的。有没有办法添加某种时间延迟,使循环每秒运行不超过 5 次?

谢谢!

4

0 回答 0