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

R语言按id与event分组提取事件首尾日期并去重实现方法

常见错误原因

你之前操作没得到正确结果,大概率是两个原因:

  1. 没有把date列从字符串转为日期类型,直接按字符串排序/求极值不符合实际日期的先后逻辑
  2. 用了mutate而非summarise做聚合,mutate会保留所有原始行,不会自动去重,需要额外去重,而summarise会按分组返回一行结果,直接完成去重需求

R tidyverse 实现方案

依赖包

library(dplyr)
library(lubridate) # 用于简化日期格式转换,也可替换为base R的日期函数

完整处理代码

# 构造示例数据,你可以替换为自己导入的数据集
df <- tibble(
  id = c(1,1,1,2,2,2,2),
  date = c("01/02/2016", "02/03/2016", "16/04/2015", "01/03/2018", "10/03/2018", "15/02/2019", "22/02/2019"),
  event = c("paracetamol", "paracetamol", "ibuprofen", "paracetamol", "codeine", "codeine", "codeine")
)

# 核心处理逻辑
result <- df %>%
  # 转换为日/月/年格式的日期类型,这一步是关键
  mutate(date = dmy(date)) %>%
  # 按id和event分组
  group_by(id, event) %>%
  # 聚合计算每组的最早、最晚日期,聚合后自动按分组去重
  summarise(
    first_event = format(min(date), "%d/%m/%Y"),
    last_event = format(max(date), "%d/%m/%Y"),
    .groups = "drop" # 处理完成后自动解除分组,避免后续操作出现预期外的分组逻辑
  )

如果不想使用lubridate包,可以把日期转换行替换为:

mutate(date = as.Date(date, format = "%d/%m/%Y"))

Python pandas 实现方案

完整处理代码

import pandas as pd

# 构造示例数据,你可以替换为自己导入的数据集
data = {
    "id": [1,1,1,2,2,2,2],
    "date": ["01/02/2016", "02/03/2016", "16/04/2015", "01/03/2018", "10/03/2018", "15/02/2019", "22/02/2019"],
    "event": ["paracetamol", "paracetamol", "ibuprofen", "paracetamol", "codeine", "codeine", "codeine"]
}
df = pd.DataFrame(data)

# 核心处理逻辑
## 转换为日期类型
df["date"] = pd.to_datetime(df["date"], format="%d/%m/%Y")
## 按id和event分组聚合,自动去重
result = df.groupby(["id", "event"], as_index=False).agg(
    first_event=("date", "min"),
    last_event=("date", "max")
)
## 转换回原字符串日期格式
result["first_event"] = result["first_event"].dt.strftime("%d/%m/%Y")
result["last_event"] = result["last_event"].dt.strftime("%d/%m/%Y")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:15:03