首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用API函数循环4种不同的作物,从USDA NASS获取数据

使用API函数循环4种不同的作物,从USDA NASS获取数据
EN

Stack Overflow用户
提问于 2019-04-02 20:58:45
回答 1查看 83关注 0票数 0

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

我有4种作物的清单:玉米、大豆、大米和小麦,我正试图利用API函数从美国农业部NASS获得这四种作物的国家年度价格数据。我试图通过使用for循环来实现这一点,而不必单独下载每个作物的数据。

R码

代码语言:javascript
复制
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")
}

这是我的预期输出的一个例子。

代码语言:javascript
复制
Year    State   Commodity   Value
2017    ALABAMA WHEAT   4.6
2017    ALASKA  CORN    4.2
2017    ARIZONA CORN    4.55
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-02 21:46:16

考虑使用expand.grid为美国各州和作物的所有配对建立一个数据框架。然后使用Map (包装器到mapply)按元素遍历数据,下载每个csv。甚至返回下载的csv的read.csv()来构建数据帧列表。你甚至可以加上一年!

幸运的是,R有一个内置的美国州数据集(state.abb).另外,由于下载涉及一个循环,所以Sys.sleep()在下载数据时暂停处理。最后,由于APIs涉及第三方外部处理,可能由于各种原因而失败,因此使用了tryCatch

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55483475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档