使用API​​函数循环遍历4种不同的农作物以从USDA NASS获取数据

时间:2019-04-02 20:58:46

标签: r

我对R还是很陌生,我正试图循环使用4种不同的农作物,并使用USDA NASS的API函数下载这些农作物的数据。

我列出了四种作物:玉米,大豆,水稻和小麦,我正尝试使用API​​函数从USDA 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

1 个答案:

答案 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)