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 列表,稍后我可以取消嵌套?
使用 tibble
s 而不是 data.frame
s 创建列表列要容易得多(参见 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
我想创建一个列,它是一个小标题列表(不同行号)。 直接的方法失败了。 示例:
> 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 列表,稍后我可以取消嵌套?
使用 tibble
s 而不是 data.frame
s 创建列表列要容易得多(参见 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