如何使用 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()
-输出
或者另一种选择是 arrange
和 fct_inorder
gss_cat %>%
arrange(ave(race == "Other", marital)) %>%
mutate(marital = fct_inorder(marital)) %>%
ggplot(aes(marital, fill = race)) +
geom_bar(position = "fill") +
coord_flip()
考虑 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()
-输出
或者另一种选择是 arrange
和 fct_inorder
gss_cat %>%
arrange(ave(race == "Other", marital)) %>%
mutate(marital = fct_inorder(marital)) %>%
ggplot(aes(marital, fill = race)) +
geom_bar(position = "fill") +
coord_flip()