如何按另一变量中某组的频次重新排序单变量的所有因子组
按Yes选项频次降序排列分组的解决方案
要实现x轴分组按Yes选项的总频次降序排列,无需手动指定因子水平,可以使用forcats包的fct_reorder()函数自动完成排序,以下是具体实现方法:
方法一:在ggplot中直接处理x轴变量
直接在aes()里对group进行排序,指定按Yes对应的value总和降序排列:
library(tidyverse) set.seed(1) df <- tibble::tibble( group = c(rep("A", 5), rep("B", 5), rep("C", 5), rep("D", 5)), fill = sample(c("Yes", "Maybe", "No"), size = 20, replace = T), value = round(runif(20, 0, 10))) df %>% ggplot( aes( x = fct_reorder(group, value, .fun = function(x) sum(x[fill == "Yes"]), .desc = TRUE), fill = fill, y = value)) + geom_col() + labs(x = "group") # 重置x轴标签为原名称
方法二:先预处理数据列
先对df中的group列重新排序,再进行绘图:
# 预处理数据,按Yes的value总和降序排列group df_sorted <- df %>% mutate(group = fct_reorder(group, value, .fun = ~sum(.[fill == "Yes"]), .desc = TRUE)) # 绘图 df_sorted %>% ggplot(aes(x = group, fill = fill, y = value)) + geom_col()
代码说明
fct_reorder():自动根据指定规则重新排序因子水平- 第一个参数:需要排序的因子列(此处为
group) - 第二个参数:用于排序的数值变量(此处为
value) .fun:指定排序依据的计算逻辑,这里用sum()计算每个分组中Yes对应的总value.desc = TRUE:设置为降序排列- 匿名函数:仅筛选
fill为"Yes"的行计算总和,确保排序仅基于Yes选项的频次
- 第一个参数:需要排序的因子列(此处为
运行上述代码后,x轴分组会自动按Yes选项的总频次从高到低排列,示例数据中最终顺序为C → D → A → B。
内容的提问来源于stack exchange,提问作者Cameron
相关产品推荐
相关产品推荐

