如何读取嵌套的 json 文件并从 r 中的数据框中的数据框中提取信息?

How to read nested json file and pull information from dataframe inside dataframe in r?

我正在读取 json 文件作为 api 的响应,该文件是 嵌套的 ,当我在 中查看它们时dataframe/table结构格式则数据框.

下有数据框

我已将文件保存在 github 位置。

library(tidyverse)
library(rjson)
library(jsonlite)
library(RCurl)
library(httr)
library(broom)

# file is available at this github link:

file_url1 <- "https://raw.githubusercontent.com/johnsnow09/covid19-df_stack-code/main/json_response.json"

json_response <- fromjson(url(file_url1))

我对 sessions 变量 中的数据感兴趣,并尝试使用 maptidy,但没有用。

json_response %>%

#converting dataframe cols to list
  map_if(., is.data.frame, list) %>% 
  
  # to tibble
  map_if(is_list, tibble) %>%
  mutate(sessions = map(sessions, broom::tidy),
         vaccine_fees = map(vaccine_fees, tidy)) %>% 
  unnest()

以上代码无效!!

也从另一个 SO post 读取并尝试:

library(rjson)

url(file_url1) %>% 
  # jsonlite::fromJSON()
  rjson::fromJSON()
map_dfr(json_response[[1]]$centers[[1]]$sessions[[1]], as.tibble)

但是没能得到正确的信息。

这样做的目的是从 json 文件中获取有关以下字段的信息: district_namenamemin_age_limitavailable_capacityavailable_capacity_dose1vaccine,然后可以根据所需的值对其应用过滤器。

您可以 unnest sessions 变量和其中的 slots 变量以获得长数据帧。

library(magrittr)
library(tidyr)

jsonlite::fromJSON(file_url1) %>%
  .[[1]] %>% 
  unnest(sessions) %>%
  unnest(slots)

# A tibble: 280 x 20
#   center_id name    address   state_name district_name block_name pincode   lat  long from 
#       <int> <chr>   <chr>     <chr>      <chr>         <chr>        <int> <int> <int> <chr>
# 1      1273 CGHS W… CGHS Pat… Delhi      West Delhi    Not Appli…  110008    28    77 09:0…
# 2      1273 CGHS W… CGHS Pat… Delhi      West Delhi    Not Appli…  110008    28    77 09:0…
# 3      1273 CGHS W… CGHS Pat… Delhi      West Delhi    Not Appli…  110008    28    77 09:0…
# 4      1273 CGHS W… CGHS Pat… Delhi      West Delhi    Not Appli…  110008    28    77 09:0…
# 5    594035 Tihar … Tihar Ja… Delhi      West Delhi    Not Appli…  110064    28    77 09:0…
# 6    594035 Tihar … Tihar Ja… Delhi      West Delhi    Not Appli…  110064    28    77 09:0…
# 7    594035 Tihar … Tihar Ja… Delhi      West Delhi    Not Appli…  110064    28    77 09:0…
# 8    594035 Tihar … Tihar Ja… Delhi      West Delhi    Not Appli…  110064    28    77 09:0…
# 9    594035 Tihar … Tihar Ja… Delhi      West Delhi    Not Appli…  110064    28    77 09:0…
#10    594035 Tihar … Tihar Ja… Delhi      West Delhi    Not Appli…  110064    28    77 09:0…
# … with 270 more rows, and 10 more variables: to <chr>, fee_type <chr>, session_id <chr>,
#   date <chr>, available_capacity <int>, min_age_limit <int>, vaccine <chr>, slots <chr>,
#   available_capacity_dose1 <int>, available_capacity_dose2 <int>