R语言dplyr中group_by后用arrange分组失效如何解决
问题原因
dplyr 中 arrange() 默认参数为 .by_group = FALSE,该模式下排序会直接忽略数据集的分组标记,对全表做全局排序,不会自动把分组变量纳入排序优先级,所以你写的代码只会全局按year、quarter升序排列,不会实现按Route_ID拆分后组内排序的效果。
另外group_by()本身不会修改数据的行顺序,仅会给数据集附加分组属性,所以不管你把group_by()放在arrange()之前还是之后,都不会改变arrange()默认全局排序的行为。
解决方法
两种写法都能实现需求,按需选择即可:
- 写法1:保留分组结构,开启按组排序参数
在arrange()中设置.by_group = TRUE,函数会自动优先按分组变量排序,再按你指定的字段完成组内排序。排序后数据集的分组标记会保留,后续做组内统计、变换等操作不需要重新分组:df %>% group_by(Route_ID) %>% arrange(year, quarter, .by_group = TRUE) - 写法2:显式指定分组变量为第一排序优先级
如果你不需要保留排序后的分组属性,或者不想额外记参数,可以直接把Route_ID放在arrange()排序字段的最前面,排序效果和上面完全一致:
如果后续需要继续做组内操作,在这句前后加上df %>% arrange(Route_ID, year, quarter)group_by(Route_ID)即可。
内容的提问来源于stack exchange,提问作者Federico Puglisi
相关产品推荐
相关产品推荐

