Nestled Loop 无法从 NOAA 收集数据

Posted

技术标签:

【中文标题】Nestled Loop 无法从 NOAA 收集数据【英文标题】:Nestled Loop not Working to gather data from NOAA 【发布时间】:2018-02-22 09:50:37 【问题描述】:

我正在使用 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。

【问题讨论】:

对于write.csv(),请检查您的工作目录,或尝试指定完整的文件路径。 另外,不要用点命名文件,使用下划线或破折号 bid_year.csv 或 bid-year.csv 我做了这些更改并添加了令牌密钥仍然无效 连同它所需的其他软件包...对于Minimum, Complete and Verifiable Example (MCVE),包括所有相关代码,包括library 行和数据输入。请确保它可以自行运行以供我们复制。 这是完整的#Parfait,在此先感谢您的关注 【参考方案1】:

这个错误信息表明没有任何1990年给定站id的数据。因为你使用for循环,一旦出错,它就会停止。

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

# Load packages
library(tidyverse)
library(rnoaa)

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

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

data_list <- buoys(dataset = 'wlevel')

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

第 2 步:创建一个在没有数据时不会中断的“安全”版本。 还要让这个函数适合map2函数

因为我们将使用map2 来循环使用map2 函数的.x.y 参数来遍历idyear 的所有组合。我们修改了参数序列以创建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_datawlevel_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)]

【讨论】:

以上是关于Nestled Loop 无法从 NOAA 收集数据的主要内容,如果未能解决你的问题,请参考以下文章

来自 NOAA 的历史天气数据

NOAA 雷达图像的 MKOverlayRenderer 无法正确显示(拉伸)

使用 LOOP 将 Oracle 批量收集到集合中

从R中的NOAA下载选择文件

NOAA 使用 python 的每小时数据

下载 NOAA 数据