Рассмотрите возможность создания фрейма данных всех пар штатов США и культур с использованием expand.grid
. Затем используйте Map
(обертка для mapply
) для поэлементного итерации по данным для загрузки каждого соответствующего CSV. Даже верните read.csv()
загруженного csv, чтобы создать список фреймов данных. Вы даже можете добавить год !
К счастью, 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)