2017-09-13 1 views
1

Ich verwende das R-Paket rnoaa (zusammen mit anderen Paketen erforderlich), um historische Wetterdaten zu sammeln. Ich habe diese verschachtelte Schleife geschrieben, um alle Datensätze zu sammeln, aber ich bekomme immer Fehler, wenn ich sie ausführe. Es scheint, für eine zweite FeinVerschachtelte Schleife funktioniert nicht, um Daten von NOAA zu sammeln

Die Schleife zu laufen:

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') 
} 
} 

Die Antwort:

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

Es speichert die erste Datensatz, aber es gilt nicht die in den Dateinamen Es nennt es nur bid_range.csv.

+0

Für 'write.csv()' überprüfen Sie Ihr Arbeitsverzeichnis, oder versuchen Sie, den vollständigen Dateipfad anzugeben. – Mako212

+0

Auch nicht Namen mit Punkten, verwenden Sie Unterstreichung oder Bindestrich bid_year.csv oder bid-year.csv – Mako212

+0

Ich habe diese Änderungen und fügte einen Token-Schlüssel immer noch nicht zur Verfügung – farmerm3

Antwort

1

Diese Fehlermeldung zeigt an, dass 1990 keine Daten einer bestimmten Stations-ID vorhanden sind. Da Sie die for-Schleife verwenden, wird nach dem Auftreten eines Fehlers gestoppt.

Hier stelle ich die Verwendung von tidyverse vor, um die NOAA Bojendaten herunterzuladen. Viele der folgenden Funktionen stammen aus dem purrr Paket, das Teil der tidyverse ist.

# Load packages 
library(tidyverse) 
library(rnoaa) 

Schritt 1: Erstellen Sie eine "Grid" alle Kombination von id und Jahr enthalten

Die expand Funktion von tidyr die Kombination verschiedener Werte schaffen.

data_list <- buoys(dataset = 'wlevel') 

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

Schritt 2: Erstellen Sie eine „sichere“ Version, die nicht bricht, wenn es keine Daten gibt. Auch diese Funktion geeignet machen für die map2 Funktion

Weil wir map2 eine Schleife durch alle die Kombination von id und year mit der map2 Funktion durch sein .x und .y Argument verwenden. Wir haben die Sequenz des Arguments geändert, um buoy_modify zu erstellen. Wir verwenden auch die safely Funktion, um eine safe Version von buoy_modify zu erstellen. Wenn es nun auf einen Fehler trifft, speichert es die Fehlermeldung und wechselt zur nächsten, statt zu unterbrechen.

# 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) 

Schritt 3: Tragen Sie die buoy_safe Funktion

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 = "_") 

Nach diesem Schritt werden alle Daten wurden in wlevel_data heruntergeladen. Jedes Element in wlevel_data besteht aus zwei Teilen. $result zeigt die Daten an, wenn der Download erfolgreich ist, ansonsten zeigt er NULL. $error zeigt NULL, wenn der Download erfolgreich ist, andernfalls wird die Fehlermeldung angezeigt.

Schritt 4:

transpose können eine Liste "inside out" drehen die Daten zugreifen. So jetzt wlevel_data2 hat zwei Elemente: Ergebnis und Fehler. Wir können diese beiden speichern und auf die Daten zugreifen.

# 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)] 
Verwandte Themen