如何使用Tidyverse按ID计算每个预约日期对应的上一次预约日期?
基于Tidyverse实现客户上一次预约日期匹配
你可以直接使用dplyr内置的lag()窗口函数实现需求,核心逻辑为按客户编号分组后,组内对预约日期升序排序,取当前行的前一行日期作为上一次预约时间,无前置记录的首条数据自动返回NA,完全符合预期输出要求。
实现代码
# 加载Tidyverse套件 library(tidyverse) # 构造样例输入数据(实际使用时替换为你的数据源即可) raw_df <- tibble( Client_number = c(1, 1, 1, 2, 2, 2), Appointment_date = as.Date(c( "2021-06-03", "2021-07-01", "2021-08-26", "2019-08-01", "2019-08-15", "2019-09-02" )) ) # 数据处理 result_df <- raw_df %>% # 按客户编号分组 group_by(Client_number) %>% # 组内按预约日期升序排序,避免原始数据乱序导致结果错误 arrange(Appointment_date, .by_group = TRUE) %>% # 生成上一次预约日期字段,n=1表示取前1行的值 mutate(Last_appointment = lag(Appointment_date, n = 1)) %>% # 解除分组,避免后续操作受分组影响 ungroup()
输出验证
运行上述代码后result_df的结果与预期输出完全一致:
| Client_number | Appointment_date | Last_appointment |
|---|---|---|
| 1 | 2021-06-03 | NA |
| 1 | 2021-07-01 | 2021-06-03 |
| 1 | 2021-08-26 | 2021-07-01 |
| 2 | 2019-08-01 | NA |
| 2 | 2019-08-15 | 2019-08-01 |
| 2 | 2019-09-02 | 2019-08-15 |
内容的提问来源于stack exchange,提问作者Dylan Pieper
相关产品推荐
相关产品推荐

