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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:57:17