2017-11-11 123 views
7

我有一個從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

    回答

    6

    另一種解決方案通過@ 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 
    
    5

    不確定是否有更多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 
    
    相關問題