nest 获取向量的列表列,而不是数据帧的列表列

nest to get list-columns of vectors rather than list-column of data frames

提问人:lost 提问时间:11/1/2023 更新时间:11/1/2023 访问量:53

问:

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

r dplyr tidyr

评论

4赞 Onyambu 11/1/2023
这等效于 .确保 prinitng 如上图所示。我不相信有函数可以做到这一点。您将不得不使用上面看起来很奇怪的方式。as_tibble(aggregate(.~Species, iris, list))as_tibble

答:

0赞 Nir Graham 11/1/2023 #1

这样可以节省大约 30 个字符:

iris |>
 group_by(Species) |> 
 summarise_all(list)