将数据框转换为深层嵌套列表

Chr*_*ris 5 r purrr r-whisker

我正在尝试创建一个whisker包期望的数据结构,我似乎无法弄清楚如何从我的数据框创建该结构.假设我有以下数据框:

library(dplyr)  

existing_format <- 
  mtcars %>% 
    select(carb, gear, cyl) %>% 
    arrange(carb, gear, cyl) %>% 
    distinct() 
Run Code Online (Sandbox Code Playgroud)

...我想转到existing_format以下所需格式(仅desired_format显示列表的前两个元素):

desired_format <- list(
  list( 
    carb = "1",
    gear = list(
      list(gear = "3", cyl = list(list(cyl = "4"), list(cyl = "6"))),
      list(gear = "4", cyl = list(list(cyl = "4")))
    )
  ),
  list( 
    carb = "2",
    gear = list(
      list(gear = "3", cyl = list(list(cyl = "8"))),
      list(gear = "4", cyl = list(list(cyl = "4"))),
      list(gear = "5", cyl = list(list(cyl = "4")))
    )
  )
)
Run Code Online (Sandbox Code Playgroud)

我已经试过类似的东西通过分组carbgear,然后使用tidyr::nest()创建嵌套的DF,但没有做.有些东西告诉我,whisker::iteratelist()或者whisker::rowSplit()是前进的方向,但我无法弄明白.

谢谢,克里斯

MrF*_*ick 6

在这种情况下可能比它需要的更灵活,但是你可以进行递归拆分

rsplit<-function(dd) {
  col <- names(dd)[1]
  dat <- dd[[1]]
  xx <- lapply(unique(dat), function(x) {
    z <- setNames(list(x), col)
    if(ncol(dd)>1) {
      z[[names(dd)[2]]] <- rsplit(dd[dat==x,-1, drop=FALSE])
    }
    z
  })
  xx
}

rsplit(existing_format)
Run Code Online (Sandbox Code Playgroud)

这将拆分所有列并使用列标题中的名称.