Nestled Loop 无法从 NOAA 收集数据
Nestled Loop not Working to gather data from 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。
这个报错信息显示1990年没有给定站点id的任何数据。因为你用的是for循环,一旦出错就停止了。
这里介绍一下tidyverse
下载NOAA浮标数据的使用方法。下面的很多函数都来自 purrr
包,它是 tidyverse
.
的一部分
# Load packages
library(tidyverse)
library(rnoaa)
第 1 步:创建一个包含所有 id 和年份组合的 "Grid"
tidyr
中的 expand
函数可以创建不同值的组合。
data_list <- buoys(dataset = 'wlevel')
data_list2 <- data_list %>%
select(id) %>%
expand(id, year = 1990:2017)
第2步:创建一个"safe"版本,当没有数据时不中断。
也让这个函数适用于map2函数
因为我们将使用 map2
通过 .x
和 .y
参数。我们修改了参数序列以创建 buoy_modify
。我们还使用 safely
函数创建 buoy_modify
的 safe
版本。现在当它遇到错误时,它会存储错误消息并移至下一个而不是中断。
# 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
可以转一个列表"inside out"。所以现在 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)]
我正在使用 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。
这个报错信息显示1990年没有给定站点id的任何数据。因为你用的是for循环,一旦出错就停止了。
这里介绍一下tidyverse
下载NOAA浮标数据的使用方法。下面的很多函数都来自 purrr
包,它是 tidyverse
.
# Load packages
library(tidyverse)
library(rnoaa)
第 1 步:创建一个包含所有 id 和年份组合的 "Grid"
tidyr
中的 expand
函数可以创建不同值的组合。
data_list <- buoys(dataset = 'wlevel')
data_list2 <- data_list %>%
select(id) %>%
expand(id, year = 1990:2017)
第2步:创建一个"safe"版本,当没有数据时不中断。 也让这个函数适用于map2函数
因为我们将使用 map2
通过 .x
和 .y
参数。我们修改了参数序列以创建 buoy_modify
。我们还使用 safely
函数创建 buoy_modify
的 safe
版本。现在当它遇到错误时,它会存储错误消息并移至下一个而不是中断。
# 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
可以转一个列表"inside out"。所以现在 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)]