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

R语言按ID分组选取最早日期行并保留所有列的实现方法

解决方案

针对「按ID分组取最早日期行且保留所有列」的需求,有几种常用实现方式,适配你已经在用的dplyr语法:

方法1:分组排序后取每组首行

最稳妥的通用写法,优先保证同ID下日期按升序排列后再取第一行:

library(dplyr)
dfunique <- df %>%
  # 同ID内按日期升序排列,最早日期自动排在组内最前
  arrange(ID, date) %>%
  group_by(ID) %>%
  # 取每组1行,自动保留所有原始列
  slice_head(n = 1) %>%
  ungroup()
  • 注意:分组操作完成后一定要加ungroup(),否则后续对数据的操作会默认按分组状态执行,容易出现异常结果。
    如果同ID下存在多条相同的最早日期,该方法默认保留排序后的第一条;如果需要保留所有同最早日期的行,可改用filter(date == min(date))替换slice_head步骤。

方法2:排序后直接用distinct

你之前尝试过的distinct方法只要补上前置排序步骤就能符合要求:

dfunique2 <- df %>%
  # 先按ID、日期升序排,避免distinct取到非最早的行
  arrange(ID, date) %>%
  distinct(ID, .keep_all = TRUE)

方法3:直接筛选组内最小日期行

不需要提前排序,直接筛选符合条件的行:

dfunique3 <- df %>%
  group_by(ID) %>%
  # 保留同ID下日期等于最小日期的所有行
  filter(date == min(date)) %>%
  ungroup()

Base R 无包依赖实现

如果不想加载dplyr,可以用原生语法实现:

dfunique_base <- df[df$date == ave(df$date, df$ID, FUN = min), ]

之前尝试的问题说明

  • 用summarise的问题:summarise默认只返回分组列和显式指定的聚合列,不会自动保留其他原始列,不适合用来做行筛选操作
  • 用distinct的问题:它是按数据原始行的出现顺序去重,不会自动按日期排序,补个前置arrange就能解决
    最终运行上述代码得到的结果完全匹配你给出的目标数据框结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 15:15:07