如何使用 fct_reorder() 仅按另一个向量的子集对因子重新排序?

How to reorder a factor by only a subset of another vector using fct_reorder()?

考虑 forcats 包中的 gss_cat 数据集。

我想创建一个最终看起来像这样的填充条形图:

注意我按race变量中“Other”的比例排序marital

我解决这个问题的方法是创建上面的图,如下所示:

library(tidyverse)

forcats::gss_cat %>% 
  group_by(marital) %>% 
  mutate(new_var = case_when(race == "Other" ~ mean(race == "Other"),
                         TRUE ~ 0)) %>% 
  ungroup() %>% 
  mutate(marital = fct_reorder(marital, new_var, max)) %>% 
  ggplot(aes(marital, fill = race)) +
  geom_bar(position = "fill") +
  coord_flip()

基本上,我使用中间变量 new_var 来订购 marital

我的问题:

是否有更简单的方法来根据 race 变量的“Other”的比例更改 marital 的因子水平的顺序,而不必使用中间步骤 group_by/mutate/ungroup?

我可以通过告诉它仅使用 race(其中 race == "Other")的特定子集的最大值来在 fct_reorder 函数中执行这些步骤吗?

我们可以通过在 mutate 步骤上使用 ave 来减少几个步骤

library(forcats)
library(dplyr)
library(ggplot2)
gss_cat %>% 
    mutate(marital = fct_reorder(marital, ave(race == "Other", marital), max)) %>%
    ggplot(aes(marital, fill = race)) +
     geom_bar(position = "fill") +
     coord_flip()

-输出


或者另一种选择是 arrangefct_inorder

gss_cat %>% 
   arrange(ave(race == "Other", marital)) %>%
   mutate(marital = fct_inorder(marital)) %>% 
   ggplot(aes(marital, fill = race)) +
     geom_bar(position = "fill") +
     coord_flip()