Доступ к объектам списка в фрейме данных в R с помощью dplyr select - PullRequest
0 голосов
/ 30 апреля 2020

Я запросил API с помощью логики c в этой статье , и я застрял, пытаясь извлечь элементы данных из ответа API.

Я буду sh, чтобы извлечь следующие элементы (адрес_1, адрес_2, лицензия и эмитент) из фрейма данных, но мое отсутствие знаний в R не позволяет мне настраивать данные за пределами первого уровня фрейм данных.

Я пробовал использовать одинарные квадратные, двойные квадратные скобки и символы доллара в нескольких перестановках, но я не могу понять правильный синтаксис. Если бы кто-то мог помочь мне с этим, я был бы очень признателен.

Я бы sh сохранил проанализированные данные во фрейме данных в структуре, подобной этой

    Number       address_1       address_2   license         issuer
 1154328938    7702 E PARHAM RD   STE 304  0101052331    MEDICARE GROUP

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

library(tidyverse)
library(httr)
library(jsonlite)

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

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

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

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

enter image description here

Ответы [ 3 ]

2 голосов
/ 30 апреля 2020

Вы можете использовать:

address <- df$results.addresses[[1]][c('address_1', 'address_2')]
address
#        address_1 address_2
#1 7702 E PARHAM RD   STE 304
#2 7702 E PARHAM RD   STE 304

license <- df$results.taxonomies[[1]]['license']
license
#     license
#1 0101052331

issuer <- df$results.identifiers[[1]]['issuer']
issuer
#          issuer
#1 MEDICARE GROUP

Аналогично, используя dplyr::select

library(dplyr)
df %>%
  select(results.addresses) %>% .[[1]] %>% .[[1]] %>%
  select('address_1','address_2')


df %>%
  select(results.taxonomies) %>% .[[1]] %>% .[[1]] %>%
  select('license')

df %>%
  select(results.identifiers) %>% .[[1]] %>% .[[1]] %>%
  select('issuer')
2 голосов
/ 30 апреля 2020

Это вложенный список, поэтому мы должны извлечь этот список либо с помощью [[, либо использовать pluck

library(dplyr)
library(purrr)
df %>% 
     select(results.addresses) %>%
     pluck(1, 1, 'address_1')
#[1] "7702 E PARHAM RD" "7702 E PARHAM RD"

Если мы проверим str, он станет более очевидным

str(select(df, results.addresses))
#'data.frame':  1 obs. of  1 variable:
# $ results.addresses:List of 1
#  ..$ :'data.frame':   2 obs. of  10 variables:
#...
1 голос
/ 30 апреля 2020

Я понял, но это может быть не красиво. Я обнаружил unnest_wider, который добился цели.

library(tidyverse)
library(httr)
library(jsonlite)
library(purrr)

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

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

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

df <- 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...