哪个是最好的方法来扁平化从关系数据库使用tidyverse工具派生的嵌套列表?

哪个是最好的方法来扁平化从关系数据库使用tidyverse工具派生的嵌套列表?

问题描述:

我有一个从REST调用收到的嵌套列表。响应包括来自底层关系数据库的嵌套的一组列表。我想将这个列表展平以简化分析。我试图遵循purrr tutorial中的指导原则,但我无法实现。哪个是最好的方法来扁平化从关系数据库使用tidyverse工具派生的嵌套列表?

我的简化输入

hist1 <- list(field="type", from_string ="issue", to_string="bug") 
hist2 <- list(field="status", from_string ="open", to_string="closed") 
hist3 <- list(field="type", from_string ="bug", to_string="issue") 
issue1 <- list(id="123", created = "2017-11-08", issue_history = list(hist1, hist2)) 
issue2 <- list(id="124", created = "2017-11-10", issue_history = list(hist1, hist3)) 
issue <- list(issue1, issue2) 

我找一个平坦的输出:

id created type from_string to_string 
123 2017-11-08 type issue  bug 
123 2017-11-08 status open   closed 
123 2017-11-10 type bug   issue 

这是建设scable逻辑这个的最好方法?

最好的(对我来说):从tidyverse

  • 代码,维护简单
  • 没有规模数以百万计的问题,即性能和内存并不是关键要素

    • 工具
  • +0

    的帮助 @Psidom解决方案非常感谢对我来说也是维护复杂的少 – rgustavs

    另一种解决方案通过@ Nate的回答启发:

    map_df(issue, as_tibble) %>% 
        mutate(issue_history = map(issue_history, as_tibble)) %>% 
        unnest() 
    
    # A tibble: 4 x 5 
    #  id created field from_string to_string 
    # <chr>  <chr> <chr>  <chr>  <chr> 
    #1 123 2017-11-08 type  issue  bug 
    #2 123 2017-11-08 status  open closed 
    #3 124 2017-11-10 type  issue  bug 
    #4 124 2017-11-10 type   bug  issue 
    

    不确定是否有更多purrr这样做,但它的工作原理。

    library(tidyverse) 
    
    map(issue, as.tibble) %>% 
        map_df(~ rowwise(.) %>% 
          mutate(issue_history = list(bind_rows(issue_history))) %>% 
          unnest()) 
    
    # A tibble: 4 x 5 
        id created field from_string to_string 
        <chr>  <chr> <chr>  <chr>  <chr> 
    1 123 2017-11-08 type  issue  bug 
    2 123 2017-11-08 status  open closed 
    3 124 2017-11-10 type  issue  bug 
    4 124 2017-11-10 type   bug  issue