在R中按唯一ID计算指定事件间的间隔天数(含过滤)
R数据框分组计算事件间隔天数的实现方案
核心思路
按unique_id分组,先筛选出包含目标字符串(如"A_type"、"C_type")的事件,再为每个A类事件匹配其之后出现的首个C类事件,最终计算两者的日期间隔天数。
代码实现
首先加载依赖包:
library(tidyverse) library(lubridate)
然后执行数据处理逻辑:
# 转换日期格式并筛选目标事件类型 df_processed <- df %>% mutate(event_date = ymd(event_date)) %>% filter(str_detect(event_type, "A_type|C_type")) # 分组匹配每个A事件对应的首个后续C事件 result <- df_processed %>% group_by(unique_id) %>% mutate( # 为每个A事件查找同组中后续最早的C事件日期 event_date_C = map_dbl(event_date, ~ if_else( str_detect(event_type, "A_type"), min(df_processed$event_date[ df_processed$unique_id == cur_group()$unique_id & df_processed$event_date > .x & str_detect(df_processed$event_type, "C_type") ], na.rm = TRUE), NA_real_ )), event_date_C = as_date(event_date_C) ) %>% # 仅保留有对应C事件的A事件行 filter(str_detect(event_type, "A_type") & !is.na(event_date_C)) %>% # 重命名列并计算间隔天数 rename(event_type_A = event_type, event_date_A = event_date) %>% mutate( event_type_C = "C_type_event", days_between = as.numeric(event_date_C - event_date_A) ) %>% select(unique_id, event_type_A, event_date_A, event_type_C, event_date_C, days_between) # 查看结果 print(result)
代码说明
- 日期转换与事件筛选:用
ymd()将字符型日期转为标准日期格式,通过str_detect()按字符串匹配筛选出A类和C类事件,满足多事件类型下的灵活过滤需求。 - 分组匹配事件:按
unique_id分组后,用map_dbl()遍历每个A事件的日期,找到同组中在该日期之后的最早C事件日期。 - 结果整理:过滤掉无对应C事件的A事件,重命名列名并计算日期间隔天数,最终输出符合要求的结构。
运行结果
针对示例数据,运行后会得到所有A事件对应的首个后续C事件及间隔天数:
# A tibble: 4 × 6 # Groups: unique_id [1] unique_id event_type_A event_date_A event_type_C event_date_C days_between <chr> <chr> <date> <chr> <date> <dbl> 1 id_101 A_type_event 2022-01-01 C_type_event 2022-03-10 68 2 id_101 A_type_event 2022-02-15 C_type_event 2022-03-10 23 3 id_101 A_type_event 2022-02-28 C_type_event 2022-03-10 10 4 id_101 A_type_event 2022-03-20 C_type_event 2022-04-01 12
内容的提问来源于stack exchange,提问作者Wes Furlong
相关产品推荐
相关产品推荐

