如何使用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
相关产品推荐
相关产品推荐

