使用fct_relevel按组重新排序因子只会改变第一组中的因子顺序

3

背景:我需要使用因子顺序来使得arrange以一定的方式显示表格。即,我想在每个组的末尾获得“总计”行。

问题:使用fct_relevel仅能在第一个组中达到期望的输出。

示例:

library(dplyr)
library(forcats)

total_masses <- starwars %>% 
  group_by(species) %>% 
  summarise(mass = sum(mass),
            name = "Total mass")

df <- bind_rows(starwars, total_masses) %>% 
  select(species, name, mass) %>% 
  group_by(species) %>% 
  mutate(name = fct_relevel(name, "Total mass", after = Inf)) %>% 
  arrange(mass, name, species) 
df
#> # A tibble: 125 x 3
#> # Groups:   species [38]
#>    species        name                   mass
#>    <chr>          <fct>                 <dbl>
#>  1 Aleena         Ratts Tyerell            15
#>  2 Aleena         Total mass               15
#>  3 Yoda's species Total mass               17 # I expect this line to be at the end of the Yoda's species group
#>  4 Yoda's species Yoda                     17
#>  5 Ewok           Total mass               20
#>  6 Ewok           Wicket Systri Warrick    20
#>  7 Droid          R2-D2                    32
#>  8 Droid          R5-D4                    32
#>  9 Dug            Total mass               40
#> 10 Dug            Sebulba                  40
#> # ... with 115 more rows

这是由reprex软件包(v2.0.0)在2021年05月31日创建的

我希望每个物种类别的末尾都有对应的总质量

   species        name                   mass
   <chr>          <fct>                 <dbl>
 1 Aleena         Ratts Tyerell            15
 2 Aleena         Total mass               15
 3 Yoda's species Yoda                     17
 4 Yoda's species Total mass               17
etc...

我觉得解决方案很明显,但我找不到正确的关键词来解决它... 欢迎任何提示!
1个回答

2

然后只需执行 fct_relevel,不需要分组,然后再次分组并在组内进行任何想做的操作。

library(dplyr)
library(forcats)

total_masses <- starwars %>% 
  group_by(species) %>% 
  summarise(mass = sum(mass),
    name = "Total mass")

# your codes
df <- bind_rows(starwars, total_masses) %>% 
  select(species, name, mass) %>% 
  group_by(species) %>% 
  mutate(name = fct_relevel(name, "Total mass", after = Inf)) %>% 
  arrange(mass, name, species) 
# Which result Total Mass is at 2nd so it will be above other levels
levels(df$name)
#>  [1] "Ratts Tyerell"         "Total mass"            "Dexter Jettster"      
#>  [4] "Ki-Adi-Mundi"          "Mas Amedda"            "Zam Wesell"           
#>  [7] "BB8"                   "C-3PO"                 "IG-88"                
...

你可以使用 ungroup 然后 fct_relevel,再进行 group_by 接着 arrange

df <- bind_rows(starwars, total_masses) %>% 
  select(species, name, mass) %>% ungroup() %>%
  mutate(name = fct_relevel(name, "Total mass", after = Inf)) %>% 
  group_by(species) %>% 
  arrange(mass, name, species) 

# Output
df
#> # A tibble: 125 x 3
#> # Groups:   species [38]
#>    species        name                   mass
#>    <chr>          <fct>                 <dbl>
#>  1 Aleena         Ratts Tyerell            15
#>  2 Aleena         Total mass               15
#>  3 Yoda's species Yoda                     17
#>  4 Yoda's species Total mass               17
#>  5 Ewok           Wicket Systri Warrick    20
#>  6 Ewok           Total mass               20
#>  7 Droid          R2-D2                    32
#>  8 Droid          R5-D4                    32
#>  9 Dug            Sebulba                  40
#> 10 Dug            Total mass               40
#> # … with 115 more rows

# As you see now Total Mass is at the last item
levels(df$name)
#>  [1] "Ackbar"                "Adi Gallia"            "Anakin Skywalker"     
#>  [4] "Arvel Crynyd"          "Ayla Secura"           "Bail Prestor Organa"  
#>  [7] "Barriss Offee"         "BB8"                   "Ben Quadinaros"       
#> [10] "Beru Whitesun lars"    "Bib Fortuna"           "Biggs Darklighter"    
#> [13] "Boba Fett"             "Bossk"                 "C-3PO"                
#> [16] "Captain Phasma"        "Chewbacca"             "Cliegg Lars"          
#> [19] "Cordé"                 "Darth Maul"            "Darth Vader"          
#> [22] "Dexter Jettster"       "Dooku"                 "Dormé"                
#> [25] "Dud Bolt"              "Eeth Koth"             "Finis Valorum"        
#> [28] "Finn"                  "Gasgano"               "Greedo"               
#> [31] "Gregar Typho"          "Grievous"              "Han Solo"             
#> [34] "IG-88"                 "Jabba Desilijic Tiure" "Jango Fett"           
#> [37] "Jar Jar Binks"         "Jek Tono Porkins"      "Jocasta Nu"           
#> [40] "Ki-Adi-Mundi"          "Kit Fisto"             "Lama Su"              
#> [43] "Lando Calrissian"      "Leia Organa"           "Lobot"                
#> [46] "Luke Skywalker"        "Luminara Unduli"       "Mace Windu"           
#> [49] "Mas Amedda"            "Mon Mothma"            "Nien Nunb"            
#> [52] "Nute Gunray"           "Obi-Wan Kenobi"        "Owen Lars"            
#> [55] "Padmé Amidala"         "Palpatine"             "Plo Koon"             
#> [58] "Poe Dameron"           "Poggle the Lesser"     "Quarsh Panaka"        
#> [61] "Qui-Gon Jinn"          "R2-D2"                 "R4-P17"               
#> [64] "R5-D4"                 "Ratts Tyerell"         "Raymus Antilles"      
#> [67] "Rey"                   "Ric Olié"              "Roos Tarpals"         
#> [70] "Rugor Nass"            "Saesee Tiin"           "San Hill"             
#> [73] "Sebulba"               "Shaak Ti"              "Shmi Skywalker"       
#> [76] "Sly Moore"             "Tarfful"               "Taun We"              
#> [79] "Tion Medon"            "Wat Tambor"            "Watto"                
#> [82] "Wedge Antilles"        "Wicket Systri Warrick" "Wilhuff Tarkin"       
#> [85] "Yarael Poof"           "Yoda"                  "Zam Wesell"           
#> [88] "Total mass"

本文创建于2021年5月31日,使用reprex包 (v2.0.0)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接