R展平嵌套的data.table

时间:2016-11-04 10:41:19

标签: r nested data.table

我有嵌套数据表,将嵌套表展平为一个data.table的最佳方法是什么?请注意,嵌套表的长度可能不等,因此tidyr :: unnest()不起作用。

代码示例:

NestedTable <- data.table(
  COLUMN1 = c('var1', 'var2','var3'),
  COLUMN2 = c('col2a', 'col2b', 'col2c')
)

# add nested data.tables
NestedTable[ , NESTED_COL := list(list(data.table(
  COLUMN4 = c(
    'A', 'B'
  ), 
  COLUMN5 = c(
    'C', 'D'
  )
)))]

NestedTable[ , NESTED_COL2 := list(list(data.table(
  COLUMN6 = c(
    'A', 'B','C'
  ), 
  COLUMN7 = c(
    'C', 'D','E'
  )
)))]

#      COLUMN1 COLUMN2 COLUMN4 COLUMN5 COLUMN6 COLUMN7
# 1:    var1   col2a   A       C       A       C
# 2:    var1   col2a   B       D       B       D
# 3:    var1   col2a                   C       E
# 4:    var2   col2b   A       C       A       C
# 5:    var2   col2b   B       D       B       D
# 6:    var2   col2b                   C       E
# 7:    var3   col2c   A       C       A       C
# 8:    var3   col2c   B       D       B       D
# 9:    var3   col2c                   C       E

3 个答案:

答案 0 :(得分:3)

我们可以尝试unlist

NestedTable[, unlist(NESTED_COL, recursive=FALSE), .(COLUMN1, COLUMN2)]

答案 1 :(得分:2)

您可以使用tidyr

NestedTable %>%
  tidyr::unnest(NESTED_COL)
#>    COLUMN1 COLUMN2 COLUMN4 COLUMN5
#> 1:    var1   col2a       A       C
#> 2:    var1   col2a       B       D
#> 3:    var2   col2b       A       C
#> 4:    var2   col2b       B       D
#> 5:    var3   col2c       A       C
#> 6:    var3   col2c       B       D

答案 2 :(得分:0)

我认为tidyr::unnest_widertidyr::unnest_longer的混合应该可行。 unnest_wider产生一个表列1-7。 unnest_longer取消嵌套每个列表。

NestedTable%>%
  unnest_wider(NESTED_COL)%>%
  unnest_wider(NESTED_COL2)
# A tibble: 3 x 6
#  COLUMN1 COLUMN2 COLUMN4   COLUMN5   COLUMN6   COLUMN7  
#  <chr>   <chr>   <list>    <list>    <list>    <list>   
#1 var1    col2a   <chr [2]> <chr [2]> <chr [3]> <chr [3]>
#2 var2    col2b   <chr [2]> <chr [2]> <chr [3]> <chr [3]>
#3 var3    col2c   <chr [2]> <chr [2]> <chr [3]> <chr [3]>


NestedTable%>%
  unnest_wider(NESTED_COL)%>%
  unnest_wider(NESTED_COL2)%>%
  unnest_longer(COLUMN4)%>%
  unnest_longer(COLUMN5)%>%
  unnest_longer(COLUMN6)%>%
  unnest_longer(COLUMN7)
# A tibble: 108 x 6
#   COLUMN1 COLUMN2 COLUMN4 COLUMN5 COLUMN6 COLUMN7
#   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>  
# 1 var1    col2a   A       C       A       C      
# 2 var1    col2a   A       C       A       D      
# 3 var1    col2a   A       C       A       E      
# 4 var1    col2a   A       C       B       C      
# 5 var1    col2a   A       C       B       D      
# 6 var1    col2a   A       C       B       E      
# 7 var1    col2a   A       C       C       C      
# 8 var1    col2a   A       C       C       D      
# 9 var1    col2a   A       C       C       E      
#10 var1    col2a   A       D       A       C      
# ... with 98 more rows