R语言:筛选Event2发生后或同时Event1消失的人员及其所有观测
解决方案:筛选符合条件的随访记录
问题拆解
需要筛选满足以下条件的人员,并保留其所有随访记录:
- 该人员至少发生过一次Event2(原描述“仅需发生一次”实际指至少发生一次,示例中多次发生Event2的ID1也符合条件)
- 在Event2首次发生的时间点及之后,Event1出现“消失”情况:即Event1在Event2首次发生前/同时有过1的记录,之后转为0
R代码实现(使用dplyr)
首先加载dplyr包,通过分组处理每个ID的记录:
library(dplyr) # 示例数据集 ID <- c(1,1,1,1,1,2,2,2,3,3,4,4,4,4,5,5,5,6,6,6,6,6,6) Visit <- c(1,2,3,4,5,1,2,3,1,2,1,2,3,4,1,2,3,1,2,3,4,5,6) Event1 <- c(0,1,0,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,1,0,0) Event2 <- c(0,1,1,1,1,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1) df <- data.frame(ID, Visit, Event1, Event2) # 筛选符合条件的记录 df_filtered <- df %>% group_by(ID) %>% mutate( # 标记是否发生过Event2 has_event2 = any(Event2 == 1), # 找到Event2首次发生的随访时间 first_visit2 = ifelse(has_event2, min(Visit[Event2 == 1]), NA), # 检查Event2首次发生前/同时是否出现过Event1=1 event1_happened_before = any(Event1[Visit <= first_visit2] == 1), # 检查Event2首次发生后/同时是否出现Event1=0(即Event1消失) event1_disappeared_after = any(Event1[Visit >= first_visit2] == 0) ) %>% # 筛选满足所有条件的ID filter(has_event2, event1_happened_before, event1_disappeared_after) %>% # 移除中间计算的辅助列 select(-has_event2, -first_visit2, -event1_happened_before, -event1_disappeared_after) %>% ungroup() # 查看结果 print(df_filtered)
结果验证
运行代码后,输出将仅包含ID为1、2、4的所有随访记录,与预期一致:
ID Visit Event1 Event2 1 1 1 0 0 2 1 2 1 1 3 1 3 0 1 4 1 4 0 1 5 1 5 0 1 6 2 1 1 0 7 2 2 0 1 8 2 3 0 0 9 4 1 0 0 10 4 2 1 0 11 4 3 1 1 12 4 4 0 1
内容的提问来源于stack exchange,提问作者Jenn0804
相关产品推荐
相关产品推荐

