如何用R语言tidyverse按唯一ID合并交易数据保留首尾日期
用tidyverse合并重复记录的实现方案
步骤说明
基于你的需求,我们可以通过tidyverse的分组+汇总操作实现:按ID和Transaction #分组后,保留每组第一条的Process #、组内最早的Start Date和最晚的End Date。
示例代码
首先加载依赖包并构造测试数据:
library(tidyverse) # 构造测试数据(模拟你的输入格式) df <- tibble( ID = c("ID1", "ID1", "ID1", "ID1", "ID2", "ID2"), `Transaction #` = c("ID1_T1", "ID1_T1", "ID1_T1", "ID1_T1", "ID2_T1", "ID2_T1"), `Process #` = c("P1", "P2", "P3", "P4", "P5", "P6"), `Start Date` = as.Date(c("2022-01-03", "2022-01-10", "2022-01-17", "2022-01-24", "2022-02-01", "2022-02-08")), `End Date` = as.Date(c("2022-01-09", "2022-01-16", "2022-01-23", "2022-01-31", "2022-02-07", "2022-02-14")) )
执行合并操作:
# 分组并汇总目标字段 processed_df <- df %>% group_by(ID, `Transaction #`) %>% summarise( `Process #` = first(`Process #`), # 保留每组第一条的Process编号 `Start Date` = min(`Start Date`, na.rm = TRUE), # 提取组内最早的起始日期 `End Date` = max(`End Date`, na.rm = TRUE), # 提取组内最晚的结束日期 .groups = "drop" # 处理完成后取消分组 ) # 查看处理结果 print(processed_df)
关键细节说明
- 如果你的原始数据是按流程顺序排列的,
first()可以精准获取第一个Process #;若需要严格取组内第一条记录的Start Date,只需把min()替换为first()即可 na.rm = TRUE用于忽略可能存在的缺失值,避免计算出错.groups = "drop"确保输出的是普通数据框,而非分组数据框,方便后续操作
内容的提问来源于stack exchange,提问作者Dossonseansky
相关产品推荐
相关产品推荐

