首页 > 解决方案 > `save()` 和 `resave()` 的使用 - 使用 R 版本 4.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 循环之外,但就像我说我正在下载每一年的数据一样,我已经确认了这一点。

谢谢

标签: rfor-looprnoaa

解决方案


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.


推荐阅读