我对R非常陌生,我试图循环4种不同的作物,并使用USDA NASS的API函数下载这些作物的数据。
我有4种作物的清单:玉米、大豆、大米和小麦,我正试图利用API函数从美国农业部NASS获得这四种作物的国家年度价格数据。我试图通过使用for循环来实现这一点,而不必单独下载每个作物的数据。
R码
library(tidyverse)
library(tidyverse)
library(plyr)
library(dplyr)
library(httr)
library(lubridate)
library(jsonlite)
crops<-c("CORN", "SOYBEANS", "RICE", "WHEAT")
for(i in 1:length(crops)){
crop<-crops[i]
#access ag land values data form nass using api
data_url <- paste(
"http://quickstats.nass.usda.gov/api/api_GET/?key=my_API_KEY",
"&commodity_desc=crops",
"&short_desc=PRICE RECEIVED, MEASURED IN $ / BU",
"&state_alpha=KS",
"&year=2017",
"&format=CSV",
sep=""
)
download.file(data_url, destfile="cropprices.csv")
}这是我的预期输出的一个例子。
Year State Commodity Value
2017 ALABAMA WHEAT 4.6
2017 ALASKA CORN 4.2
2017 ARIZONA CORN 4.55发布于 2019-04-02 21:46:16
考虑使用expand.grid为美国各州和作物的所有配对建立一个数据框架。然后使用Map (包装器到mapply)按元素遍历数据,下载每个csv。甚至返回下载的csv的read.csv()来构建数据帧列表。你甚至可以加上一年!
幸运的是,R有一个内置的美国州数据集(state.abb).另外,由于下载涉及一个循环,所以Sys.sleep()在下载数据时暂停处理。最后,由于APIs涉及第三方外部处理,可能由于各种原因而失败,因此使用了tryCatch。
proc_download <- function(s, c) {
cat(paste(s, c, "\n")) # PRINTS CURRENT LOOPED STATE & CROP TO SCREEN
tryCatch({
data_url <- paste0(
"http://quickstats.nass.usda.gov/api/api_GET/?key=my_API_KEY",
"&commodity_desc=", c,
"&short_desc=PRICE RECEIVED, MEASURED IN $ / BU",
"&state_alpha=", s,
"&year=2017",
"&format=CSV"
)
my_file <- paste0(s, "_", c, "_prices.csv")
download.file(data_url, destfile=my_file)
Sys.sleep(1) # ADJUSTS SECONDS AS NEEDED
df <- read.csv(my_file)
return(df)
}, error = function(e) {
print(e) # PRINTS ERROR MESSAGE TO SCREEN
return(NA)
})
}
state_crops <- expand.grid(state = state.abb, crop = c("CORN", "SOYBEANS", "RICE", "WHEAT"))
# DOWNLOAD DATA AND BUILD LIST OF DATA FRAMES
df_list <- Map(proc_download, state_crops$state, state_crops$crop)https://stackoverflow.com/questions/55483475
复制相似问题