如何从分组数据框中创建命名列表?

zli*_*ipp 4 r dplyr purrr tidyverse

有几次,我需要将分组数据帧的两列转换为列表,其中分组列成为列表的名称,非分组列的值成为元素。

例如,给定starwars数据集,假设我们想按角色的家乡列出角色。

library(tidyverse)

starwars %>%
  select(homeworld, name) %>%
  group_by(homeworld)

#> # A tibble: 87 x 2
#> # Groups:   homeworld [49]
#>    homeworld               name
#>        <chr>              <chr>
#>  1  Tatooine     Luke Skywalker
#>  2  Tatooine              C-3PO
#>  3     Naboo              R2-D2
#>  4  Tatooine        Darth Vader
#>  5  Alderaan        Leia Organa
#>  6  Tatooine          Owen Lars
#>  7  Tatooine Beru Whitesun lars
#>  8  Tatooine              R5-D4
#>  9  Tatooine  Biggs Darklighter
#> 10   Stewjon     Obi-Wan Kenobi
#> # ... with 77 more rows
Run Code Online (Sandbox Code Playgroud)

如何将其转换为具有名称的列表homeworld?也就是说,对于上面的输出,我们会得到:

#> $Alderaan
#> [1] "Leia Organa"
#> 
#> $Naboo
#> [1] "R2-D2"
#> 
#> $Stewjon
#> [1] "Obi-Wan Kenobi"
#> 
#> $Tatooine
#> [1] "Luke Skywalker"     "C-3PO"              "Darth Vader"       
#> [4] "Owen Lars"          "Beru Whitesun lars" "R5-D4"             
#> [7] "Biggs Darklighter"
Run Code Online (Sandbox Code Playgroud)

www*_*www 6

感谢@thelatemail,使用 split:

split(df$name,df$homeworld)
Run Code Online (Sandbox Code Playgroud)

输出:

$Alderaan
[1] "Leia Organa"

$Naboo
[1] "R2-D2"

$Stewjon
[1] "Obi-Wan Kenobi"

$Tatooine
[1] "Luke Skywalker"     "C-3PO"              "Darth Vader"       
[4] "Owen Lars"          "Beru Whitesun lars" "R5-D4"             
[7] "Biggs Darklighter" 
Run Code Online (Sandbox Code Playgroud)

样本数据:

require(data.table)
df <- fread("homeworld,               name
              Tatooine,     Luke Skywalker
              Tatooine,              C-3PO
                 Naboo,              R2-D2
              Tatooine,        Darth Vader
              Alderaan,        Leia Organa
              Tatooine,          Owen Lars
              Tatooine, Beru Whitesun lars
              Tatooine,              R5-D4
              Tatooine,  Biggs Darklighter
               Stewjon,     Obi-Wan Kenobi")
Run Code Online (Sandbox Code Playgroud)