如何在dplyr的case_when()中仅标记每个时间点的首个事件?
标记数据框中每个时间区间的首个事件
你需要在含多时间点的数据框中,仅标记每个时间区间内的首个事件(而非该区间的全部事件),之前用case_when/if_else会给区间内所有事件赋值,无法满足时间线分析的单次标记需求,可通过分组排序+去重判断实现,具体方案如下:
核心思路
- 按个体(如患者ID)分组,同时按时间戳排序,确保事件按时间先后顺序排列
- 先划分目标时间区间,再在每个分组内,判断当前事件是否为对应区间的首次出现,仅标记首次事件
示例代码
library(tidyverse) # 读取并预处理数据 data <- read_csv("my_data.csv") processed_data <- data %>% # 按个体ID和受伤后月份排序,保证时间顺序正确 arrange(patient_id, time_from_injury_months) %>% group_by(patient_id) %>% mutate( # 定义时间区间(补充你提到的12-24个月区间) time_interval = case_when( accepted_reduction == "x" ~ "0", time_from_injury_months >= 12 & time_from_injury_months < 24 ~ "1", time_from_injury_months >= 24 & time_from_injury_months < 36 ~ "2", time_from_injury_months >= 36 & time_from_injury_months < 48 ~ "3", time_from_injury_months >= 48 & time_from_injury_months < 60 ~ "4" ), # 仅标记每个区间的首个事件:1表示是首个事件,0表示不是 is_first_event = ifelse(!duplicated(time_interval) & !is.na(time_interval), 1, 0) ) %>% ungroup()
变体需求处理
如果需要直接保留首个事件的区间标记,其余同区间事件的区间字段设为NA,可修改代码如下:
processed_data <- data %>% arrange(patient_id, time_from_injury_months) %>% group_by(patient_id) %>% mutate( time_interval = case_when( accepted_reduction == "x" ~ "0", time_from_injury_months >= 12 & time_from_injury_months < 24 ~ "1", time_from_injury_months >= 24 & time_from_injury_months < 36 ~ "2", time_from_injury_months >= 36 & time_from_injury_months < 48 ~ "3", time_from_injury_months >= 48 & time_from_injury_months < 60 ~ "4" ), # 仅保留每个区间首个事件的区间值,其余设为NA first_event_timepoint = ifelse(!duplicated(time_interval) & !is.na(time_interval), time_interval, NA) ) %>% ungroup()
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

