0

因此,作为免责声明,我已经阅读了多个线程并尝试了不同的方法,建议这些方法都不起作用。

这是我正在使用的代码,然后我将解释正在发生的事情以及我希望发生的事情:

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()仅允许下载最多 1 年的数据,因此,如果您想下载 1948 - 2020 年的数据,我设计了上述代码。另外,你会看到 for 循环是 (2009:2019) 我随意选择一次下载 1 个十年,因为下载过程非常耗时。我只是在 (1948:1959) 开始 for 循环,然后是 (1960:1969),ECT...

我知道保存作品的所有代码,每一年的数据在我的全球环境中都是可见的。我遇到问题的地方在于储蓄。我已经尝试了在不同线程中找到的所有以下扩展名(.RData、.Rda、.rds)。然后,当我尝试“读入”该数据时,尽管我可以在计算机上的目标文件夹中看到它,但它并不存在。

最初,我至少能够保存 2020 年的最后几行代码......都在 for 循环之外,但就像我说我正在下载每一年的数据一样,我已经确认了这一点。

谢谢

4

2 回答 2

0

So I tried answer #1 and here is the error I received:

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.

I went back and all 73 elements of "res" are 1 by 8 tibbles, so I am confused by the column error, unless they do not like the headers as compared to $data. When ncdc() download, it downloads as a list and the using info is stored in $data.

Also, since I love to learn. From other languages I have always used "for loops" for repetitive tasks. Can someone explain how lapply() accomplishes this and I am assuming that setnames is a way to set multiple variables for downloading individual years.

于 2020-08-06T19:32:57.377 回答
0

我同意上面的评论 - 听起来更有意义的是制作一个函数一年,运行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-05T21:25:34.730 回答