【问题标题】:Converting data frame into deeply nested list将数据框转换为深度嵌套列表
【发布时间】:2017-12-13 21:42:13
【问题描述】:

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

library(dplyr)  

existing_format <- 
  mtcars %>% 
    select(carb, gear, cyl) %>% 
    arrange(carb, gear, cyl) %>% 
    distinct() 

...我想从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")))
    )
  )
)

我尝试过按carbgear 进行分组,然后使用tidyr::nest() 创建嵌套的df,但什么也没做。有人告诉我whisker::iteratelist()whisker::rowSplit() 是前进的方向,但我想不通。

谢谢, 克里斯

【问题讨论】:

  • dflist &lt;- lapply( (existing_format %&gt;% split(., .[,'carb'])), function(xtbl) xtbl %&gt;% split(., .[,'gear'])) 这可能会让您领先一步。
  • 有帮助,谢谢

标签: r purrr r-whisker


【解决方案1】:

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

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)

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

【讨论】:

    【解决方案2】:

    这是一种方法,不适用于 n 列,但它适用于 3。

    library(purrr)
    library(magrittr)
    library(dplyr)
    
    output <- existing_format                           %>%
        map_df(as.character)                            %>%
        group_by(carb,gear)                             %>%
        summarize_at("cyl",~lst(map(.,~lst(cyl = .x)))) %>%
        mutate(gear = map2(.x = gear,.y = cyl,~lst(gear = .x,cyl = .y))) %>%
        group_by(carb)                                  %>%
        summarize_at("gear",~lst(gear=.))               %$%
        map2(.x = carb,.y = gear,~lst(carb = .x,gear = .y))
    
    identical(output[1:2],desired_format) #TRUE
    

    【讨论】:

    • 感谢您的回答。您可能正在使用与我不同版本的 purrr,b/c 我在运行您的答案时遇到错误。我已经将它编辑为适合我的版本(尽管如果你认为它应该改回来,请随时告诉我)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2021-06-17
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多