Использование `save ()` и `resave ()` - с использованием R версии 4.0 - PullRequest
0 голосов
/ 05 августа 2020
• 1000 должно произойти:
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, я разработал приведенный выше код. Кроме того, вы увидите, что для l oop is (2009: 2019) я произвольно выбрал загрузку 1 десятилетия за раз, потому что процесс загрузки требует много времени. Я просто запускаю для l oop в (1948: 1959), затем (1960: 1969), ECT ...

Я знаю весь код вплоть до сохранения работ, видны данные за каждый год в моей глобальной среде. У меня проблема с сохранением. Я пробовал все следующие расширения (.RData, .Rda, .rds), которые нашел в разных потоках. Когда я затем пытаюсь «прочитать» эти данные, они не существуют, хотя я вижу их в папке назначения на моем компьютере.

Первоначально мне удалось сохранить хотя бы последние строки кода, которые на 2020 год ... все за пределами l oop, но, как я уже сказал, я загружаю данные за каждый год, я это подтвердил.

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Итак, я попробовал ответить №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.

Я вернулся, и все 73 элемента «res» имеют размер 1 на 8 тиблей, поэтому меня смущает столбец error, если им не нравятся заголовки по сравнению с $ data. Когда ncdc() загружается, он загружается в виде списка, а информация об использовании сохраняется в $ data.

Кроме того, поскольку я люблю учиться. Из других языков я всегда использовал «циклы for» для повторяющихся задач. Может ли кто-нибудь объяснить, как lapply() выполняет это, и я предполагаю, что setnames - это способ установить несколько переменных для загрузки отдельных лет.

0 голосов
/ 06 августа 2020

Я согласен с комментариями выше - похоже, что было бы разумнее создать функцию на один год, запустить 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")
...