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

在R中按双变量分组后,如何用ggplot实现正确排序与数据筛选?

解决Iris数据集分组分析的两个问题

问题原因与修正代码

针对分组分析中的两个问题,以下是具体原因和修正后的代码:

iris_new <- iris %>% 
  mutate(number_petals = sample(1:10, size = 150, replace = TRUE))

# 修正后的完整代码
iris_new %>% 
  group_by(number_petals, Species) %>%
  # 保留所有分组变量,避免summarise自动移除Species
  summarise(n = sum(Petal.Length, na.rm = TRUE), .groups = "keep") %>%
  # 全局按求和值n降序排序(若需组内排序,改用下方注释的代码)
  arrange(desc(n)) %>%
  # 全局取前25个最大的求和值(替代head(25))
  slice_max(n, n = 25) %>%
  ggplot(aes(x = reorder(number_petals, n), y = n, fill = factor(Species))) +
  xlab("Number of Petals") +
  ylab("Total sum of petal lengths") +
  geom_col()

问题1:添加Species后无法降序排序

  • 核心原因:summarise() 默认会丢弃最后一个分组变量(此处为Species),执行后数据仅保留number_petals作为分组依据,导致arrange(desc(n), by_group = TRUE)只能在number_petals组内排序,无法实现基于两个分组的整体排序。
  • 修正方式:在summarise()中加入.groups = "keep"参数,强制保留所有分组变量。排序逻辑可按需选择:
    • 全局按求和值降序:直接使用arrange(desc(n))。
    • 按number_petals分组、组内按求和值降序:保留arrange(desc(n), by_group = TRUE),此时会先按number_petals分组,组内按n降序排列。

问题2:head(25)未按分组筛选

  • 核心原因:head(25)是对整个数据集取前25行,完全不考虑分组规则,自然无法实现按分组筛选前N个最大值的需求。
  • 修正方式:
    • 全局取前25个最大求和值:用slice_max(n, n = 25)替代head(25),该函数专门用于筛选指定列的最大值,逻辑更清晰。
    • 按number_petals分组、组内取前k个最大值:先重新执行group_by(number_petals),再用slice_max(n, n = k)(例如n=2表示每个组取前2个),最后合并结果。

内容的提问来源于stack exchange,提问作者David Færgeman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:15:40