Передача многих значений в API с использованием R - PullRequest
0 голосов
/ 01 мая 2020

Я буду sh, чтобы масштабировать мой рабочий запрос API, чтобы запросить много идентификаторов, и сохранить его в хорошем прямоугольном angular фрейме данных.

Мне нужна помощь, чтобы понять, как я могу масштабировать свой код до взять много входных переменных, а затем, как их хранить.

Мой рабочий код выглядит следующим образом:

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) 

Теперь я sh запросю эти 4 идентификатора и сохраню их в том же формате данных, что и в примере выше.

Я попытался использовать 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, но это где я падаю. Другая часть состоит в том, как извлечь соответствующие значения из возвращенных объектов и сохранить их в аккуратном фрейме данных.

Ваша помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 01 мая 2020

Вы должны добавить шаги «очистки» и вернуть df внутри вашей функции getNPI, затем вы можете позже использовать 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, как ожидается, все имена столбцов должны быть одинаковыми.

...