首页 > 解决方案 > 使用 dplyr 通过将列值分组为单个列来透视数据框

问题描述

第一次海报 - 请善待。

我有一个包含 2 列的 df,我想对其进行旋转,以便其中一列中的每个唯一值成为新 df 的列名,并在该列的单元格中具有其关联值。

以星球大战为例……

starwars %>% 
select(name, homeworld)

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

...我想旋转 df 使得每个 homeworld 都是一列,下面是来自该 homeworld 的字符的名称。当然,会有一些列比其他列有更多的观察 - 我可以让这些成为 NA 来填充 df。

pivot_wider,并使用类似问题的答案,我设法将家庭世界作为行,而不是列......

starwars %>%
select(name, homeworld) %>%
group_by(homeworld) %>%
mutate(rn = row_number()) %>%
ungroup() %>%
pivot_wider(names_from = rn, values_from = name)

# A tibble: 49 x 12
   homeworld  `1`                 `2`               `3`            `4`         `5`               `6`      `7`             `8`            `9`          `10`       `11`       
   <chr>      <chr>               <chr>             <chr>          <chr>       <chr>             <chr>    <chr>           <chr>          <chr>        <chr>      <chr>      
 1 Tatooine   Luke Skywalker      C-3PO             Darth Vader    Owen Lars   Beru Whitesun la… R5-D4    Biggs Darkligh… Anakin Skywal… Shmi Skywal… Cliegg La… NA         
 2 Naboo      R2-D2               Palpatine         Jar Jar Binks  Roos Tarpa… Rugor Nass        Ric Olié Quarsh Panaka   Gregar Typho   Cordé        Dormé      Padmé Amid…
 3 Alderaan   Leia Organa         Bail Prestor Org… Raymus Antill… NA          NA                NA       NA              NA             NA           NA         NA         
 4 Stewjon    Obi-Wan Kenobi      NA                NA             NA          NA                NA       NA              NA             NA           NA         NA         
 5 Eriadu     Wilhuff Tarkin      NA                NA             NA          NA                NA       NA              NA             NA           NA         NA         
 6 Kashyyyk   Chewbacca           Tarfful           NA             NA          NA                NA       NA              NA             NA           NA         NA         
 7 Corellia   Han Solo            Wedge Antilles    NA             NA          NA                NA       NA              NA             NA           NA         NA         
 8 Rodia      Greedo              NA                NA             NA          NA                NA       NA              NA             NA           NA         NA         
 9 Nal Hutta  Jabba Desilijic Ti… NA                NA             NA          NA                NA       NA              NA             NA           NA         NA         
10 Bestine IV Jek Tono Porkins    NA                NA             NA          NA                NA       NA              NA             NA           NA         NA         
# … with 39 more rows

...我想要的是这个但旋转了 90°。

我真的很感激任何帮助,最好坚持使用 dplyr / tidyverse 语言。

标签: rdplyrpivot

解决方案


names_from将我们想要的列的值作为宽格式的列名,并values_to获取这些列的值。在这里,我们可以随意使用这些值names_from作为homeworld列名。

library(dplyr)
library(tidyr)

starwars %>%
  select(name, homeworld) %>%
  group_by(homeworld) %>%
  mutate(rn = row_number()) %>%
  ungroup() %>%
  pivot_wider(names_from = homeworld, values_from = name) %>%
  select(-rn)

推荐阅读