如何在R语言中判定两个变量的时间序列关系并生成标记变量
问题:识别抗抑郁药物有效改善MCI的个体
现有一份包含个体多次随访记录的数据框,每次随访会记录两个关键指标:
MCI:MCI诊断结果(1=存在MCI,0=无MCI)ANTIDEP:抗抑郁药物使用情况(1=使用,0=未使用)
需要筛选出在使用抗抑郁药物后MCI转为0的个体(包括MCI转0的随访前或同期用药的情况),并为这些个体的所有随访记录生成标记变量ANTIDEP_helped(符合条件标记为1,否则为0)。
示例数据
ID <- c(1,1,1,1,1,2,2,2,3,3,3,3,4,4,5,5,5,5,6,6,6,6,7,7,7) Visit <- c(1,2,3,4,5,1,2,3,1,2,3,4,1,2,1,2,3,4,1,2,3,4,1,2,3) MCI <- c(1,1,1,0,0,1,1,1,1,0,0,0,1,0,1,0,0,0,1,0,1,1,1,0,1) ANTIDEP <- c(0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,1,1,0,0,0) df <- data.frame(ID, Visit, MCI, ANTIDEP)
期望结果
生成的ANTIDEP_helped变量结果为:(0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0),仅ID为3和5的个体符合条件。
解决方案(R语言)
使用dplyr包进行分组逻辑判断,代码如下:
# 若未安装dplyr,先运行 install.packages("dplyr") library(dplyr) df_result <- df %>% group_by(ID) %>% mutate( # 获取个体首次MCI转为0的随访时间(无转0则设为Inf) first_mci_zero = min(Visit[MCI == 0], Inf), # 检查首次转0时间点及之前是否有过用药记录 antidep_before_zero = any(ANTIDEP[Visit <= first_mci_zero] == 1), # 判断是否符合条件:初始有MCI + 存在转0记录 + 转0前/同期用过药 ANTIDEP_helped = as.integer(MCI[1] == 1 & first_mci_zero != Inf & antidep_before_zero) ) %>% ungroup() # 查看生成的标记变量 print(df_result$ANTIDEP_helped)
逻辑说明
- 按
ID分组,聚焦每个个体的随访序列; - 定位首次MCI转0的时间点,排除从未转0的个体;
- 验证该时间点及之前是否使用过抗抑郁药物;
- 同时确保个体初始状态为MCI阳性(首次随访
MCI=1),避免误判原本就无MCI的个体; - 符合所有条件的个体,其所有随访记录的
ANTIDEP_helped标记为1,否则为0。
内容的提问来源于stack exchange,提问作者Jenn0804
相关产品推荐
相关产品推荐

