rjsonjsonlite

Extract data.frame nested inside list


it is a basic command, but i cannot get around it.

how can one extract/filter a data.frame inside a list which is inside a data.frame...?

library(jsonlite)

url <- "https://www.ine.pt/ine/json_indicador/pindica.jsp?op=2&varcd=0000611&lang=PT"

data <- fromJSON(url) 

data results in 1 observation with 8 variables.

how to access the data.frame of 7329 observations?

data$Dados$2013$data.frame

Any help is deeply appreciated :) Thanks


Solution

  • For extracting elements from deeply nested lists, purrr::pluck is very helpful:

    library(purrr)
    library(dplyr)
    
    data %>%
        pluck(7, 1, 1) %>%
        tibble()
    
    #OR
    
    data %>%
        pluck('Dados', '2013', 1) %>%
        tibble()
    

    We can also use the iteractive dolar sign until we get the final unnamed length-1 list, then extract that last element with the double brackets ([[]]) or with purrr::list_flatten() (this requires purrr 1.0.0)

    data$Dados$`2013`[[1]]
    
    #OR#
    
    data$Dados$`2013` |> list_flatten()
    

    output

    # A tibble: 7,329 × 7
       geocod geodsg                     dim_3 dim_3_t dim_4 dim_4_t valor  
       <chr>  <chr>                      <chr> <chr>   <chr> <chr>   <chr>  
     1 1      Continente                 1     H       T     Total   4714328
     2 200    Região Autónoma dos Açores 1     H       T     Total   121646 
     3 2      Região Autónoma dos Açores 1     H       T     Total   121646 
     4 20     Região Autónoma dos Açores 1     H       T     Total   121646 
     5 3      Região Autónoma da Madeira 1     H       T     Total   122046 
     6 300    Região Autónoma da Madeira 1     H       T     Total   122046 
     7 PT     Portugal                   1     H       T     Total   4958020
     8 30     Região Autónoma da Madeira 1     H       T     Total   122046 
     9 113    Ave                        1     H       T     Total   243784 
    10 111    Minho-Lima                 1     H       T     Total   111804 
    # … with 7,319 more rows
    # ℹ Use `print(n = ...)` to see more rows