从列表中选择长度不兼容的元素

Selecting elements from a list with non compatible length

给定以下列表结构:

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"))))))
      

我正在尝试创建一个具有如下结构的数据框:

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

到目前为止,我必须执行以下操作:

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())

这会导致以下错误:

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

考虑到列表的结构(其中一个变量有 3 个值,另一个变量有 4 个值),这是有道理的。但是我没有看到 link 列表父元素的值的解决方案。这样每一个'value'也得到相应的'tlv'值。任何指导如何解决这个问题?

已找到解决方案,成功了:

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

另一种选择:

library(tidyverse)

value_1 <-
  map_depth(x, 4, pluck, "value_1", .ragged = TRUE) %>%
  map(unlist, use.names = FALSE)

tlv  <-
  map_depth(x, 3, pluck, "tlv") %>%
  map_dbl(unlist, use.names = FALSE)

df <-
  tibble(tlv = tlv, value_1 = value_1) %>%
  unnest_auto(col = value_1)