【问题标题】:Flattening lists nested in data.frames扁平化嵌套在 data.frames 中的列表
【发布时间】:2017-12-01 04:45:01
【问题描述】:

我遇到了很多嵌套在 data.frame 列中的列表,并且在可能的情况下看不到任何用于展平这些列表的通用方法 - 即,当嵌套元素可能被强制转换为具有相同行数的 data.frame 时父母。考虑这些嵌套示例:

require(dplyr)
data_frame(a=1:3, b = c('a','b','c'), c = list('cats','dogs','birds'))
#> # A tibble: 3 x 3
#>       a     b         c
#>   <int> <chr>    <list>
#> 1     1     a <chr [1]>
#> 2     2     b <chr [1]>
#> 3     3     c <chr [1]>
data_frame(a=1:3, b = c('a','b','c'), c = list(iris[1:3,]))
#> # A tibble: 3 x 3
#>       a     b                    c
#>   <int> <chr>               <list>
#> 1     1     a <data.frame [3 x 5]>
#> 2     2     b <data.frame [3 x 5]>
#> 3     3     c <data.frame [3 x 5]>
data_frame(a=1:3, b = c('a','b','c'), c = list(iris[1,], iris[2,], iris[3,]))
#> # A tibble: 3 x 3
#>       a     b                    c
#>   <int> <chr>               <list>
#> 1     1     a <data.frame [1 x 5]>
#> 2     2     b <data.frame [1 x 5]>
#> 3     3     c <data.frame [1 x 5]>

有没有一种优雅的通用方法来展平这些?我找到的最接近的是jsonlite::flatten,它声称“扁平化嵌套数据框”,但它似乎无法处理这些示例中的嵌套列表。

【问题讨论】:

    标签: r


    【解决方案1】:

    一个选项是unnest

    library(tidyr)
    data_frame(a=1:3, b = c('a','b','c'), c = list('cats','dogs','birds')) %>%
        unnest
    # A tibble: 3 x 3
    #     a     b     c
    #  <int> <chr> <chr>
    #1     1     a  cats 
    #2     2     b  dogs
    #3     3     c birds
    
    
    data_frame(a=1:3, b = c('a','b','c'), c = list(iris[1:3,])) %>% 
              unnest
    # A tibble: 9 x 7
          a     b Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    #  <int> <chr>        <dbl>       <dbl>        <dbl>       <dbl>  <fctr>
    #1     1     a          5.1         3.5          1.4         0.2  setosa
    #2     1     a          4.9         3.0          1.4         0.2  setosa
    #3     1     a          4.7         3.2          1.3         0.2  setosa
    #4     2     b          5.1         3.5          1.4         0.2  setosa
    #5     2     b          4.9         3.0          1.4         0.2  setosa
    #6     2     b          4.7         3.2          1.3         0.2  setosa
    #7     3     c          5.1         3.5          1.4         0.2  setosa
    #8     3     c          4.9         3.0          1.4         0.2  setosa
    #9     3     c          4.7         3.2          1.3         0.2  setosa
    
    data_frame(a=1:3, b = c('a','b','c'), c = list(iris[1,], iris[2,], iris[3,])) %>% 
           unnest
    # A tibble: 3 x 7
    #      a     b Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    #   <int> <chr>        <dbl>       <dbl>        <dbl>       <dbl>  <fctr>
    #1     1     a          5.1         3.5          1.4         0.2  setosa
    #2     2     b          4.9         3.0          1.4         0.2  setosa
    #3     3     c          4.7         3.2          1.3         0.2  setosa
    

    【讨论】:

    • 哇,我真的应该知道这一点。
    猜你喜欢
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 2017-11-27
    • 2014-08-12
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多