首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用‘`save()’和‘`resave()` -使用R版本4.0

使用‘`save()’和‘`resave()` -使用R版本4.0
EN

Stack Overflow用户
提问于 2020-08-06 04:25:29
回答 2查看 69关注 0票数 0

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

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

代码语言:javascript
复制
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循环之外,但正如我所说的,我正在下载每一年的数据,我已经确认了这一点。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2020-08-06 05:25:35

我同意上面的评论-听起来更有意义的做法是让一个函数运行一年,在它上面运行lapply (甚至是mclapply来并行运行),以获得结果列表,然后保存列表对象,将所有元素导出到全局环境,或者将其与data.table::rbindlist组合并保存该表。

示例(未测试,因为我没有API密钥):

代码语言:javascript
复制
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")
票数 0
EN

Stack Overflow用户

发布于 2020-08-07 03:32:57

所以我尝试了答案#1,下面是我收到的错误:

代码语言:javascript
复制
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是一种为下载单个年份设置多个变量的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63273003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档