data.frame 中列的 tibble 列表

lists of tibble to column in data.frame

我想创建一个列,它是一个小标题列表(不同行号)。 直接的方法失败了。 示例:

> x <- data.frame('a' = 1:2, 
+                 'b' = list(tibble('c' = 1:4, 'd' = 1:4),
+                            tibble('c' = 1:3, 'd' = 1:3)))
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 
  arguments imply differing number of rows: 4, 3

我可以用 I 包装它来避免错误。但是,当我这样做并尝试取消嵌套时,我做不到。

> x <- data.frame('a' = 1:2, 
+                 'b' = I(list(tibble('c' = 1:4, 'd' = 1:4),
+                            tibble('c' = 1:3, 'd' = 1:3))))
> x %>% unnest(cols = b) 
# A tibble: 2 x 2
      a b               
  <int> <I<list>>       
1     1 <tibble [4 x 2]>
2     2 <tibble [3 x 2]>

如何创建一个列,它是一个 tibble 列表,稍后我可以取消嵌套?

使用 tibbles 而不是 data.frames 创建列表列要容易得多(参见 Hadley 关于此 here 的注释)。

您可以通过从 data.frame() 切换到 tibble() 来修复您的代码:

library(dplyr)

x <- tibble(
  'a' = 1:2,
  'b' = list(
    tibble('c' = 1:4, 'd' = 1:4),
    tibble('c' = 1:3, 'd' = 1:3)
  )
)

x
#> # A tibble: 2 × 2
#>       a b               
#>   <int> <list>          
#> 1     1 <tibble [4 × 2]>
#> 2     2 <tibble [3 × 2]>

x %>% tidyr::unnest(b)
#> # A tibble: 7 × 3
#>       a     c     d
#>   <int> <int> <int>
#> 1     1     1     1
#> 2     1     2     2
#> 3     1     3     3
#> 4     1     4     4
#> 5     2     1     1
#> 6     2     2     2
#> 7     2     3     3

reprex package (v2.0.1)

创建于 2022-03-31

您可以先创建不带 list-column 的 data.frame,然后添加列表:

x <- data.frame(a = 1:2)
x$b <- list(tibble('c' = 1:4, 'd' = 1:4),
            tibble('c' = 1:3, 'd' = 1:3)
           )

对照:

str(x)
# 'data.frame': 2 obs. of  2 variables:
# $ a: int  1 2
# $ b:List of 2
#  ..$ : tibble [4 x 2] (S3: tbl_df/tbl/data.frame)
#  .. ..$ c: int  1 2 3 4
#  .. ..$ d: int  1 2 3 4
#  ..$ : tibble [3 x 2] (S3: tbl_df/tbl/data.frame)
#  .. ..$ c: int  1 2 3
#  .. ..$ d: int  1 2 3