提问人:lost 提问时间:11/1/2023 更新时间:11/1/2023 访问量:53
nest 获取向量的列表列,而不是数据帧的列表列
nest to get list-columns of vectors rather than list-column of data frames
问:
tidyr::nest()
创建数据帧/数据帧的列表列:
library(tidyverse)
iris %>% nest(data = c(-Species))
#> # A tibble: 3 × 2
#> Species data
#> <fct> <list>
#> 1 setosa <tibble [50 × 4]>
#> 2 versicolor <tibble [50 × 4]>
#> 3 virginica <tibble [50 × 4]>
这当然在很多情况下很有用。在其他情况下,我想要的是执行相同类型的隐式汇总操作,但不是创建单个 tibbles 列表列,而是将每个选定的列转换为向量列表列。
我正在寻找的东西可以通过以下方式完成:nest()
unnest_wider()
iris %>% nest(data = c(-Species)) %>%
unnest_wider(data)
#> # A tibble: 3 × 5
#> Species Sepal.Length Sepal.Width Petal.Length Petal.Width
#> <fct> <list<dbl>> <list<dbl>> <list<dbl>> <list<dbl>>
#> 1 setosa [50] [50] [50] [50]
#> 2 versicolor [50] [50] [50] [50]
#> 3 virginica [50] [50] [50] [50]
它也可以通过更明确的汇总操作来实现:
iris %>%
group_by(Species) %>%
summarize(across(everything(), vctrs::list_of))
#> # A tibble: 3 × 5
#> Species Sepal.Length Sepal.Width Petal.Length Petal.Width
#> <fct> <list<dbl>> <list<dbl>> <list<dbl>> <list<dbl>>
#> 1 setosa [50] [50] [50] [50]
#> 2 versicolor [50] [50] [50] [50]
#> 3 virginica [50] [50] [50] [50]
但这两者似乎都有点笨拙,我想知道在或相关的 tidyverse 包中是否有更简洁或更标准的方法。tidyr
答:
0赞
Nir Graham
11/1/2023
#1
这样可以节省大约 30 个字符:
iris |>
group_by(Species) |>
summarise_all(list)
评论
as_tibble(aggregate(.~Species, iris, list))
as_tibble