因此,作为免责声明,我已经阅读了多个线程,并尝试了不同的建议,但都不起作用。
这是我正在使用的代码,然后我将解释正在发生的事情以及我希望发生的事情:
library('rnoaa')
library('dplyr')
library('utils')
library('cgwtools')
data_type <- c('tmax','tmin','PRCP', 'SNOW', 'SNWD')
## Station ID for MSO is GHCND:USW00024153
## Station ID for GPI is GHCND:USC00244558
## Station ID for BTM is GHCND:USW00024135
for (i in 2009:2019){
start_date <- paste(i, '-01-01', sep = "")
end_date <- paste(i, '-12-31', sep = "")
assign(paste('mso_data', i, sep = ""), ncdc(datasetid = 'GHCND', stationid = 'GHCND:USW00024153',
datatypeid = data_type, startdate = start_date,
enddate = end_date, limit = 1000))
a <- paste('mso_data', i, sep = "")
if (i == 1948){
save(a, file = 'mso_data.RData')
}
else {
resave(a, file = 'mso_data.RData')
}
}
mso_data <- ncdc(datasetid = 'GHCND', stationid = 'GHCND:USW00024153',
datatypeid = data_type, startdate = '2020-01-01',
enddate = '2020-07-07', limit = 1000)
resave(mso_data, file = 'mso_data.RData')好的,我想要做的是使用RNOAA软件包下载多年的气候数据。在另一篇文章中,有人向我展示了一种不同的方法来下载这些数据,最后,为了使用他们的方法,我仍然需要修复我保存数据的方式。
RNOAA函数ncdc()只允许下载最多一年的数据,所以如果你想下载1948 - 2020年的数据,我设计了上面的代码。此外,您将看到for循环是(2009:2019)我随意选择一次下载10年,因为下载过程非常耗时。我只需在(1948:1959),然后(1960:1969),ECT...
我知道保存工作的所有代码,每一年的数据在我的全球环境中都是可见的。我遇到的问题是在保存方面。我已经尝试了在不同线程中找到的所有以下扩展( .RData、.Rda、.rds)。然后,当我试图“读入”该数据时,它并不存在,尽管我可以在我的计算机上的目标文件夹中看到它。
最初,我至少保留了2020年的最后几行代码……所有这些都在for循环之外,但正如我所说的,我正在下载每一年的数据,我已经确认了这一点。
谢谢
发布于 2020-08-06 05:25:35
我同意上面的评论-听起来更有意义的做法是让一个函数运行一年,在它上面运行lapply (甚至是mclapply来并行运行),以获得结果列表,然后保存列表对象,将所有元素导出到全局环境,或者将其与data.table::rbindlist组合并保存该表。
示例(未测试,因为我没有API密钥):
library(rnoaa)
library(data.table)
getNoaa <- function(yr, type = c('tmax','tmin','PRCP', 'SNOW', 'SNWD'))
ncdc(datasetid = 'GHCND',
stationid = 'GHCND:USW00024153',
datatypeid = type,
startdate = paste0(yr, '-01-01'),
enddate = paste0(yr, '-12-31'), limit = 1000)
res <- setNames(lapply(2009:2019, getNoaa), paste0("Year", 2009:2019))
# this would export all individual list elements to the global environment:
list2env(res , envir = .GlobalEnv)
# this would combine the individual lists
res <- rbindlist(res, idcol="Year")发布于 2020-08-07 03:32:57
所以我尝试了答案#1,下面是我收到的错误:
res <- rbindlist(res, idcol="Year")
Error in rbindlist(res, idcol = "Year") :
Column 1 of item 1 is length 3 inconsistent with column 2 which is length 8. Only length-1 columns are recycled.回过头来看,"res“的73个元素都是1乘8的,所以我被列错误搞糊涂了,除非他们不喜欢与$data相比的标题。当ncdc()下载时,它以列表的形式下载,并且使用信息存储在$data中。
还有,因为我喜欢学习。在其他语言中,我总是使用"for循环“来处理重复的任务。有人能解释一下lapply()是如何做到这一点的吗?我假设setnames是一种为下载单个年份设置多个变量的方法。
https://stackoverflow.com/questions/63273003
复制相似问题