我对R还是很陌生,我正试图循环使用4种不同的农作物,并使用USDA NASS的API函数下载这些农作物的数据。
我列出了四种作物:玉米,大豆,水稻和小麦,我正尝试使用API函数从USDA NASS获取这四种作物的州级年度价格数据。我试图通过使用for循环来做到这一点,而不必单独下载每种作物的数据。
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
答案 0 :(得分:0)
请考虑使用expand.grid
为美国所有州和农作物的所有配对建立一个数据框。然后使用Map
(包装到mapply
)逐个元素地遍历数据,以下载每个相应的csv。甚至返回下载的csv的read.csv()
来建立数据帧列表。您甚至可以添加 year !
幸运的是,R具有用于美国各州的内置数据集( state.abb )。另外,由于下载涉及循环,因此Sys.sleep()
会在数据下载时暂停处理。最后,由于API涉及可能由于各种原因而失败的第三方外部处理,因此使用了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)