Nestled Loop не работает для сбора данных из NOAA

Я использую R-пакет rnoaa (наряду с ним требуются другие пакеты) для сбора исторических данных о погоде. Я написал этот вложенный цикл, чтобы собрать все наборы данных, но я продолжаю получать ошибки при его запуске. Кажется, для второго штрафа

Петля:

require('triebeard')
require('bindr')
require('colorspace')
require('mime')
require('curl')
require('openssl')
require('R6')
require('urltools')
require('httpcode')
require('stringr')
require('assertthat')
require('bindrcpp')
require('glue')
require('magrittr')
require('pkgconfig')
require('rlang')
require('Rcpp')
require('BH')
require('plogr')
require('purrr')
require('stringi')
require('tidyselect')
require('digest')
require('gtable')
require('plyr')
require('reshape2')
require('lazyeval')
require('RColorBrewer')
require('dichromat')
require('munsell')
require('labeling')
require('viridisLite')
require('data.table')
require('rjson')
require('httr')
require('crul')
require('lubridate')
require('dplyr')
require('tidyr')
require('ggplot2')
require('scales')
require('XML')
require('xml2')
require('jsonlite')
require('rappdirs')
require('gridExtra')
require('tibble')
require('isdparser')
require('geonames')
require('hoardr')
require('rnoaa')
install.package('ncdf4')

install.packages("devtools")
library(devtools)
install_github("rnoaa", "ropensci")
library(rnoaa)


list <- buoys(dataset='wlevel')
lid <- data.frame(list$id)
foo <- for(range in 1990:2017){
for(bid in lid){
bid_range <- buoy(dataset = 'wlevel', buoyid = bid, year = range)
bid.year.data <- data.frame(bid.year$data)
write.csv(bid.year.data, file='cwind/bid_range.csv')
} 
}

Ответ:

Using c1990.nc
Using 
Error: length(url) == 1 is not TRUE

Он сохраняет первый набор данных, но не применяет for в имени файла, он просто называет его bid_range.csv.

1 ответ

Решение

Это сообщение об ошибке показывает, что в 1990 году не было никаких данных с указанным идентификатором станции. Поскольку вы использовали цикл for, после того, как он возвращает ошибку, он останавливается.

Здесь я представляю использование tidyverse загрузить данные с буев NOAA. Многие из следующих функций из purrr пакет, который является частью tidyverse,

# Load packages
library(tidyverse)
library(rnoaa)

Шаг 1: Создайте "Сетка", содержащую все комбинации идентификатора и года

expand функция от tidyr Можно создать комбинацию разных значений.

data_list <- buoys(dataset = 'wlevel')

data_list2 <- data_list %>%
  select(id) %>%
  expand(id, year = 1990:2017)

Шаг 2: Создайте "безопасную" версию, которая не ломается при отсутствии данных. Также сделайте эту функцию подходящей для функции map2

Потому что мы будем использовать map2 перебрать всю комбинацию id а также year с использованием map2 функция его .x а также .y аргумент. Мы изменили последовательность аргументов для создания buoy_modify, Мы также используем safely функция для создания safe версия buoy_modify, Теперь, когда он встречает ошибку, он сохраняет сообщение об ошибке и переходит к следующему, а не прерывается.

# Modify the buoy function
buoy_modify <- function(buoyid, year, dataset, ...){
  buoy(dataset, buoyid = buoyid, year = year, ...)
}

# Creare a safe version of buoy_modify
buoy_safe <- safely(buoy_modify)

Шаг 3: применить функцию buoy_safe

wlevel_data <- map2(data_list2$id, data_list2$year, buoy_safe, dataset = "wlevel")

# Assign name for the element in the list based on id and year
names(wlevel_data) <- paste(data_list2$id, data_list2$year, sep = "_")

После этого шага все данные были загружены в wlevel_data, Каждый элемент в wlevel_data имеет две части. $result показывает данные, если загрузка прошла успешно, в противном случае показывает NULL, $error шоу NULL Если загрузка прошла успешно, в противном случае отображается сообщение об ошибке.

Шаг 4: Доступ к данным

transpose можно перевернуть список "наизнанку". А сейчас wlevel_data2 имеет два элемента: результат и ошибка. Мы можем сохранить эти два и получить доступ к данным.

# Turn the list "inside out"
wlevel_data2 <- transpose(wlevel_data)

# Get the error message
wlevel_error <- wlevel_data2$error

# Get he result
wlevel_result <-  wlevel_data2$result

# Remove NULL element in wlevel_result
wlevel_result2 <- wlevel_result[!map_lgl(wlevel_result, is.null)]
Другие вопросы по тегам