Nestled Loop不工作从NOAA收集数据

时间:2017-09-13 15:40:23

标签: r noaa rnoaa

我使用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 个答案:

答案 0 :(得分:1)

此错误消息显示1990年没有任何给定工作站ID的数据。因为您使用for循环,一旦它发出错误,它就会停止。

这里我介绍使用tidyverse下载NOAA浮标数据。以下许多函数来自purrr包,它是tidyverse的一部分。

# Load packages
library(tidyverse)
library(rnoaa)

第1步:创建一个包含所有ID和年份组合的“网格”

expand中的tidyr函数可以创建不同值的组合。

data_list <- buoys(dataset = 'wlevel')

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

步骤2:创建一个在没有数据时不会中断的“安全”版本。 同时使此功能适用于map2功能

因为map2id year使用map2函数,我们将.x循环使用.ybuoy_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) 版本的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

第3步:应用buoy_safe功能

wlevel_data

完成此步骤后,所有数据都会在$result下载。 NULL中的每个元素都有两个部分。如果下载成功,$error会显示数据,否则会显示NULL。如果下载成功,transpose会显示wlevel_data2,否则会显示错误消息。

第4步:访问数据

# 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)] 可以将内容列为“由内而外”。所以现在.section有两个元素:结果和错误。我们可以存储这两个并访问数据。

typolink {
    paramter.cObject = TEXT
    paramter.cObject {
        field = uid
        wrap = #c|
    }
}