【问题标题】:Passing many values to an API using R使用 R 将许多值传递给 API
【发布时间】:2020-04-30 23:22:15
【问题描述】:

我希望扩展我的工作 API 查询以查询多个 ID 并将其存储在一个漂亮的矩形数据框中。

我需要一些帮助来了解如何扩展我的代码以获取许多输入变量以及如何存储它们。

我的工作代码如下:

pacman::p_load(tidyverse,httr,jsonlite,purrr)

path <- "https://npiregistry.cms.hhs.gov/api/?"

request <- httr::GET(url = path,
                     query = list(version = "2.0",
                                  number = 1154328938))

response <- content(request, as = "text", encoding = "UTF-8")

df <- jsonlite::fromJSON(response, flatten = TRUE) %>%
  data.frame()

providerData <- df %>% 
  select(results.number, 
         results.basic.name,
         results.basic.gender,
         results.basic.credential,
         results.taxonomies) %>%
  unnest_wider(results.taxonomies) %>% 
  rename(Provider_NPI = results.number,
         Provider_Name = results.basic.name,
         Provider_Gender = results.basic.gender,
         Provider_Credentials = results.basic.credential,
         Provider_Taxonomy = desc,
         Provider_State = state) %>% 
  select(-code,-license,-primary) 

我现在希望查询这 4 个 ID,并将它们以与上例相同的数据格式存储。

我尝试过使用 lapply 并构建自己的函数,但我不完全了解如何创建存储返回值的对象。

我的函数如下所示:

getNPI <- function(object) {
  httr::GET(url = path,
            query = list(version = "2.0",
                         number = object))

}
providerIDs <- c('1073666335',
                 '1841395357',
                 '1104023381',
                 '1477765634')

test <- lapply(providerIDs, getNPI)

我很确定我需要某种对象,如列表或数据框来存储 httr::GET 的值,但这是我失败的地方。另一部分是如何从返回的对象中提取适当的值并将它们存储在一个整洁的数据框中。

您的帮助将不胜感激。

【问题讨论】:

    标签: r rest jsonlite


    【解决方案1】:

    您必须添加“清理”步骤并在您的getNPI 函数中返回一个df,然后您可以稍后使用do.call 将所有数据“组合”成一个“最终”数据框:

    例子

    getNPI <- function(object) {
     request <- httr::GET(url = path,
        query = list(version = "2.0",
                       number = object))
    
     df <- content(request, as = "text", encoding = "UTF-8") %>%
       jsonlite::fromJSON(. , flatten = TRUE) %>%
       data.frame()
    
     df %>%
       select(results.number, 
           results.basic.name,
           results.basic.gender,
           results.basic.credential,
           results.taxonomies) %>%
     unnest_wider(results.taxonomies)
     # Add more selection, mutations as needed
    }
    
    test <- lapply(providerIDs, getNPI)
    
    # Use do.call for rbind an make the final df
    final_df <- do.call("rbind",test)
    

    希望对你有帮助

    注意:为了使rbind 能够按预期与do.call 一起使用,所有列的名称必须相同。

    【讨论】:

    • 是否有一种优雅的方法可以仅将 2 个提供者 ID 传递给 API,然后等待 10 分钟(Sys.sleep),然后再传递下一个 2?
    猜你喜欢
    • 1970-01-01
    • 2017-07-21
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 2010-11-24
    • 1970-01-01
    相关资源
    最近更新 更多