这是与此相关的问题: 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 次?
谢谢!