Search code examples
rextractnested-listspurrr

Selecting elements from a list with non compatible length


Given the following structure of the list:

x <- list(list(Main = list(one = list(tlv = 1, beta = 2), two = "three", three = 4,list_a = list(list(value_1 = "a1", value_2 = "b", c = "c")))),
      list(Main = list(one = list(tlv = 2, beta = 6), two = "seven", three = 8,list_a = list(list(value_1 = "aa2", value_2 = "bb", c = "cc")))),
      list(Main = list(one = list(tlv = 3),list_a = list(list(value_1 = c("aaa3", "aaaa4"), value_2 = c("bbb", "bbbb"), c = c("ccc", "ccc"))))))
      

I'm trying to create a dataframe with a structure like this:

tlv | value_1  
  1 | a1       
  2 | aa2      
  3 | aaa3     
  3 | aaaa4
  

so far I have to the following:

library(tidyverse)
tibble::tibble(
  tlv = map(x, list(1,1,"tlv"), .default = NA) %>% unlist(),
  value = map(x, list(1,"list_a", 1, "value"), .default = NA) %>% unlist())

Which leads to the following error:

Error: Tibble columns must have compatible sizes.
 * Size 3: Existing data.
 * Size 4: Column `value`.
 i Only values of size one are recycled.

This makes sense given the structure of the list (3 values for one of the variables en 4 values for the other). But I don't see a solution to link the values to the parent element of the list. So that every 'value' also gets the corresponding 'tlv' value. Any guidance how to solve this problem?


Solution

  • Found a solution, this does the trick:

      x %>%
      map_df(~tibble(
              tlv = .$Main$one$tlv,
              value = .$Main$list_a[[1]]$value_1))