在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个),最后合并结果。
- 全局取前25个最大求和值:用
内容的提问来源于stack exchange,提问作者David Færgeman
相关产品推荐
相关产品推荐

