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

如何使用dplyr的arrange对分组数据按组统计值排序?

解决分组后按组统计值排序的问题

嘿,这个问题我之前也碰到过!你报错的原因很清晰:当你用group_by(cyl)之后,数据还是保留了mtcars原来的32行记录,而mean(mpg)每组只返回1个值(总共3组,所以只有3个值),arrange()需要每个行对应一个排序依据值,3个值对应32行自然就不匹配了,所以抛出了那个“incorrect size”的错误。

下面给你两种常用的解决方案,看你需要哪种效果:

1. 保留所有原始行,按组的均值排序(同组行聚在一起)

如果你想保留mtcars的所有数据,同时让mpg均值最高的组排在最前面,同组的行放在一起,可以先给每个行添加上所在组的mpg均值,再基于这个新列排序:

library(dplyr)

mtcars %>%
  group_by(cyl) %>%
  # 给每行添加所在组的mpg均值
  mutate(mpg_group_mean = mean(mpg)) %>%
  # 按组均值降序排序,.by_group=TRUE确保同组行聚在一起
  arrange(desc(mpg_group_mean), .by_group = TRUE)

这样输出的结果里,4缸组(mpg均值最高)会排在最前面,接着是6缸,最后是8缸,每个组内的原始数据行都会保留。

2. 只保留分组统计结果并排序

如果你只需要每组的mpg均值,并且按均值从高到低排列,那可以先汇总再排序:

library(dplyr)

mtcars %>%
  group_by(cyl) %>%
  # 计算每组的mpg均值
  summarise(mpg_mean = mean(mpg)) %>%
  # 按均值降序排序
  arrange(desc(mpg_mean))

这个代码会输出一个3行的表格,每行对应一个气缸数组,按mpg均值从高到低排列,非常简洁。

总结一下:arrange()本身是对行操作的,所以必须保证排序依据的列和数据行数一致。要么用mutate()给每行添加上组统计值,要么用summarise()把数据压缩到分组级别再排序。

内容的提问来源于stack exchange,提问作者Pavel Shliaha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:37:40