下载 NOAA 数据
Downloading NOAA data
我正在尝试使用 rnoaa 包下载 NOAA 数据,但我 运行 遇到了一些麻烦。
我从数据框中提取了一个向量,它看起来像这样:
df <- dataframe$ghcnd
抓取必要的专栏
这给了我这样的输出:
[1] "GHCND:US1AKAB0058" "GHCND:US1AKAB0015" "GHCND:US1AKAB0021" "GHCND:US1AKAB0061"
[5] "GHCND:US1AKAB0055" "GHCND:US1AKAB0038" "GHCND:US1AKAB0051" "GHCND:US1AKAB0052"
[9] "GHCND:US1AKAB0060" "GHCND:US1AKAB0065" "GHCND:US1AKAB0062" "GHCND:US1AKFN0016"
[13] "GHCND:US1AKFN0018" "GHCND:US1AKFN0015" "GHCND:US1AKFN0011" "GHCND:US1AKFN0013"
[17] "GHCND:US1AKFN0030" "GHCND:US1AKJB0011" "GHCND:US1AKJB0014" "GHCND:US1AKKP0005"
[21] "GHCND:US1AKMS0011" "GHCND:US1AKMS0019" "GHCND:US1AKMS0012" "GHCND:US1AKMS0020"
[25] "GHCND:US1AKMS0018" "GHCND:US1AKMS0014" "GHCND:US1AKPW0001" "GHCND:US1AKSH0002"
[29] "GHCND:US1AKVC0006" "GHCND:US1AKWH0012" "GHCND:US1AKWP0001" "GHCND:US1AKWP0002"
[33] "GHCND:US1ALAT0014" "GHCND:US1ALAT0013" "GHCND:US1ALBW0095" "GHCND:US1ALBW0087"
[37] "GHCND:US1ALBW0020" "GHCND:US1ALBW0066" "GHCND:US1ALBW0031" "GHCND:US1ALBW0082"
[41] "GHCND:US1ALBW0099" "GHCND:US1ALBW0040" "GHCND:US1ALBW0004" "GHCND:US1ALBW0085"
[45] "GHCND:US1ALBW0009" "GHCND:US1ALBW0001" "GHCND:US1ALBW0094" "GHCND:US1ALBW0013"
[49] "GHCND:US1ALBW0079" "GHCND:US1ALBW0060"
实际上,我有大约 22,000 个气象站。这只是显示前 50 个。
rnoaa 代码
library(rnoaa)
options("noaakey" = Sys.getenv("noaakey"))
Sys.getenv("noaakey")
weather <- ncdc(datasetid = 'GHCND', stationid = df, var = 'PRCP', startdate = "2020-05-30",
enddate = "2020-05-30", add_units = TRUE)
这会产生以下错误:
Error: Request-URI Too Long (HTTP 414)
但是,当我将 df 子集化为前 100 个条目时,我无法获取超过前 25 个条目的数据。但是,包详细信息说我应该能够 运行 每天 10,000 个查询。
循环尝试
df1 <- df[1:125] ## Splitting dataframe. Too big otherwise
for (i in 1:length(df1)){
weather2<-ncdc(datasetid = 'GHCND', stationid=df1[i],var='PRCP',startdate ='2020-06-30',enddate='2020-06-30',
add_units = TRUE)
}
但这只会生成单行数据框,该行是第 125 个气象站。
如果有人可以就接下来要尝试什么提供建议,那就太好了:)
此外,交叉链接:https://discuss.ropensci.org/t/rnoaa-getting-county-level-rain-data/2403
在您的循环尝试中,weather2 在循环的每次迭代中都会被覆盖。
由于请求的数量和 return 的长度未知,解决此问题的一种方法是将对 ncdc
的调用包装在 lapply 语句中并保存列表中的每个响应。然后在 lapply 语句的末尾将所有数据合并到一个大数据框中。
library(rnoaa)
library(dplyr)
stationlist <-ghcnd_stations() %>% filter(state == "DE")
df <- paste0("GHCND:", stationlist$id[1:10])
#call request data multiple time and store individual results in a list
output<-lapply(df, function(station){
weather <- ncdc(datasetid = 'GHCND', stationid = station, var = 'PRCP', startdate = "2020-05-30",
enddate = "2020-05-30", add_units = TRUE)
#weather$data
#to include the meta data
data.frame(t(unlist(weather$meta)), weather$data)
})
#merge into 1 data frame
answer <-bind_rows(output)
我会在一小部分站点上验证这个过程,因为调用 NOAA 可能很慢。我试图减少搜索到感兴趣区域和仍在积极收集数据的站点的数量。
还有关于限制请求。
来自帮助页面:“请注意,默认限制(记录数 returned)为 25。查看 $meta 中的元数据以了解找到了多少条记录。如果找到的记录多于25,您可以将参数限制设置为高于 25 的值。"
在@Dave2e 的大力帮助和上面 ropensci link 上的一个萌芽的帮助下弄明白了。
df <- cleaned_emshr$ghcnd ## Grabbing necessary column
z <- split(df, ceiling(seq_along(df)/100))
out <- list()
for (i in seq_along(z)) {
out[[i]] <- ncdc(datasetid = 'GHCND', stationid = z[[i]], var = 'PRCP',
startdate = "2020-05-30", enddate = "2020-05-30",
add_units = TRUE, limit = 100)
}
weather <- bind_rows(lapply(out, "[[", "data"))
我正在尝试使用 rnoaa 包下载 NOAA 数据,但我 运行 遇到了一些麻烦。
我从数据框中提取了一个向量,它看起来像这样:
df <- dataframe$ghcnd
抓取必要的专栏
这给了我这样的输出:
[1] "GHCND:US1AKAB0058" "GHCND:US1AKAB0015" "GHCND:US1AKAB0021" "GHCND:US1AKAB0061"
[5] "GHCND:US1AKAB0055" "GHCND:US1AKAB0038" "GHCND:US1AKAB0051" "GHCND:US1AKAB0052"
[9] "GHCND:US1AKAB0060" "GHCND:US1AKAB0065" "GHCND:US1AKAB0062" "GHCND:US1AKFN0016"
[13] "GHCND:US1AKFN0018" "GHCND:US1AKFN0015" "GHCND:US1AKFN0011" "GHCND:US1AKFN0013"
[17] "GHCND:US1AKFN0030" "GHCND:US1AKJB0011" "GHCND:US1AKJB0014" "GHCND:US1AKKP0005"
[21] "GHCND:US1AKMS0011" "GHCND:US1AKMS0019" "GHCND:US1AKMS0012" "GHCND:US1AKMS0020"
[25] "GHCND:US1AKMS0018" "GHCND:US1AKMS0014" "GHCND:US1AKPW0001" "GHCND:US1AKSH0002"
[29] "GHCND:US1AKVC0006" "GHCND:US1AKWH0012" "GHCND:US1AKWP0001" "GHCND:US1AKWP0002"
[33] "GHCND:US1ALAT0014" "GHCND:US1ALAT0013" "GHCND:US1ALBW0095" "GHCND:US1ALBW0087"
[37] "GHCND:US1ALBW0020" "GHCND:US1ALBW0066" "GHCND:US1ALBW0031" "GHCND:US1ALBW0082"
[41] "GHCND:US1ALBW0099" "GHCND:US1ALBW0040" "GHCND:US1ALBW0004" "GHCND:US1ALBW0085"
[45] "GHCND:US1ALBW0009" "GHCND:US1ALBW0001" "GHCND:US1ALBW0094" "GHCND:US1ALBW0013"
[49] "GHCND:US1ALBW0079" "GHCND:US1ALBW0060"
实际上,我有大约 22,000 个气象站。这只是显示前 50 个。
rnoaa 代码
library(rnoaa)
options("noaakey" = Sys.getenv("noaakey"))
Sys.getenv("noaakey")
weather <- ncdc(datasetid = 'GHCND', stationid = df, var = 'PRCP', startdate = "2020-05-30",
enddate = "2020-05-30", add_units = TRUE)
这会产生以下错误:
Error: Request-URI Too Long (HTTP 414)
但是,当我将 df 子集化为前 100 个条目时,我无法获取超过前 25 个条目的数据。但是,包详细信息说我应该能够 运行 每天 10,000 个查询。
循环尝试
df1 <- df[1:125] ## Splitting dataframe. Too big otherwise
for (i in 1:length(df1)){
weather2<-ncdc(datasetid = 'GHCND', stationid=df1[i],var='PRCP',startdate ='2020-06-30',enddate='2020-06-30',
add_units = TRUE)
}
但这只会生成单行数据框,该行是第 125 个气象站。
如果有人可以就接下来要尝试什么提供建议,那就太好了:)
此外,交叉链接:https://discuss.ropensci.org/t/rnoaa-getting-county-level-rain-data/2403
在您的循环尝试中,weather2 在循环的每次迭代中都会被覆盖。
由于请求的数量和 return 的长度未知,解决此问题的一种方法是将对 ncdc
的调用包装在 lapply 语句中并保存列表中的每个响应。然后在 lapply 语句的末尾将所有数据合并到一个大数据框中。
library(rnoaa)
library(dplyr)
stationlist <-ghcnd_stations() %>% filter(state == "DE")
df <- paste0("GHCND:", stationlist$id[1:10])
#call request data multiple time and store individual results in a list
output<-lapply(df, function(station){
weather <- ncdc(datasetid = 'GHCND', stationid = station, var = 'PRCP', startdate = "2020-05-30",
enddate = "2020-05-30", add_units = TRUE)
#weather$data
#to include the meta data
data.frame(t(unlist(weather$meta)), weather$data)
})
#merge into 1 data frame
answer <-bind_rows(output)
我会在一小部分站点上验证这个过程,因为调用 NOAA 可能很慢。我试图减少搜索到感兴趣区域和仍在积极收集数据的站点的数量。
还有关于限制请求。
来自帮助页面:“请注意,默认限制(记录数 returned)为 25。查看 $meta 中的元数据以了解找到了多少条记录。如果找到的记录多于25,您可以将参数限制设置为高于 25 的值。"
在@Dave2e 的大力帮助和上面 ropensci link 上的一个萌芽的帮助下弄明白了。
df <- cleaned_emshr$ghcnd ## Grabbing necessary column
z <- split(df, ceiling(seq_along(df)/100))
out <- list()
for (i in seq_along(z)) {
out[[i]] <- ncdc(datasetid = 'GHCND', stationid = z[[i]], var = 'PRCP',
startdate = "2020-05-30", enddate = "2020-05-30",
add_units = TRUE, limit = 100)
}
weather <- bind_rows(lapply(out, "[[", "data"))