You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按另一变量中某组的频次重新排序单变量的所有因子组

按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:10:25