R语言中如何按id分组反转每个分组内的数据行顺序
问题背景
R语言数据处理场景下,待操作对象为名为data的数据集,包含id(个人身份编号)、date等列:
- 单个
id对应多条记录 - 数据集内同id的记录当前按
date倒序排列 - 需求为反转每个
id分组内的行顺序 - 单独调用
group_by(id)无法实现该需求
失效原因
dplyr包中的group_by()函数仅会给数据集添加分组标记,不会主动修改组内的行排列顺序,因此单独调用无法完成行反转操作,必须搭配组内行排序的逻辑才能生效。
可运行实现方案
dplyr 实现(最常用)
适配所有dplyr版本的通用写法:
library(dplyr) data <- data %>% group_by(id) %>% # 按组内原始行号倒序排列,严格反转组内行顺序 arrange(desc(row_number()), .by_group = TRUE) %>% ungroup()
如果使用dplyr 1.1.0及以上版本,可使用更简洁的.by参数写法,无需手动分组、解组:
data <- data %>% arrange(desc(row_number()), .by = id)
注意:如果确认每个
id分组内的date值无重复,也可直接使用data %>% arrange(id, date)通过按date升序排列达到顺序反转效果;但如果存在同id下多条记录date相同的情况,该写法无法保证严格匹配原有行的反转顺序,优先使用上述按组内行号排序的方案。
data.table 实现(高性能适合大数据量)
如果处理百万级以上大数据集,可使用data.table写法提升运行效率:
library(data.table) setDT(data) # 按id分组后反转组内行顺序 data <- data[.N:1, by = id]
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

