R语言按id与event分组提取事件首尾日期并去重实现方法
常见错误原因
你之前操作没得到正确结果,大概率是两个原因:
- 没有把date列从字符串转为日期类型,直接按字符串排序/求极值不符合实际日期的先后逻辑
- 用了
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
相关产品推荐
相关产品推荐

