首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套循环不工作从NOAA收集数据

嵌套循环不工作从NOAA收集数据
EN

Stack Overflow用户
提问于 2017-09-13 15:40:22
回答 1查看 147关注 0票数 1

我正在使用R包rnoaa(以及它需要其他包)来收集历史天气数据。我编写了这个嵌套循环来收集所有的数据集,但是在运行它时,我总是会收到错误。似乎是为了第二次罚款

循环:

代码语言:javascript
复制
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')
} 
}

答复:

代码语言:javascript
复制
Using c1990.nc
Using 
Error: length(url) == 1 is not TRUE

它保存了第一个数据集,但是它没有在文件名中应用for,它只是将其命名为bid_range.csv。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-15 07:38:58

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

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

代码语言:javascript
复制
# Load packages
library(tidyverse)
library(rnoaa)

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

来自expandtidyr函数可以创建不同值的组合。

代码语言:javascript
复制
data_list <- buoys(dataset = 'wlevel')

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

步骤2:创建一个“安全”版本,在没有数据时不会中断。还使此函数适合于map2函数

因为我们将使用map2循环使用id.y参数使用map2函数遍历idyear的所有组合。我们修改了参数序列以创建buoy_modify。我们还使用safely函数创建safe版本的buoy_modify。现在,当它遇到错误时,它将存储错误消息并移动到下一个,而不是中断。

代码语言:javascript
复制
# 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函数

代码语言:javascript
复制
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有两个元素:结果和错误。我们可以存储这两个文件并访问数据。

代码语言:javascript
复制
# 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)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46201692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档