R语言计算行日期差识别患者90天内二次入院的就诊记录
问题原因分析
你现有代码的逻辑存在3个核心问题,也是返回观测数少1的原因:
- 没有按患者唯一标识
Id分组,跨患者计算就诊时间差属于无效逻辑 - 仅用第一条就诊时间和后续所有时间比对,没有为每条就诊记录匹配同一名患者的下一次就诊时间
- 计算
difftime时手动截取了2:length(visit1$STARTENC),直接让计算结果比原数据少1行
正确实现方案(R语言dplyr版本)
你可以按「按患者分组→组内按就诊时间排序→匹配下一次就诊时间→计算时间差→标记目标记录」的逻辑实现:
# 加载依赖包 library(dplyr) # 数据处理逻辑 result <- visit1 %>% # 转换就诊起始时间为日期时间格式 mutate(STARTENC = as.POSIXct(STARTENC)) %>% # 按患者ID分组,仅同一名患者的就诊记录才会一起计算 group_by(Id) %>% # 同患者的就诊按时间升序排序 arrange(STARTENC, .by_group = TRUE) %>% # 提取每条就诊对应的下一次就诊时间,没有下一次的为NA mutate(next_enc_time = lead(STARTENC, n = 1)) %>% # 计算两次就诊的时间差,单位为天 mutate(readmission_interval = as.numeric(difftime(next_enc_time, STARTENC, units = "days"))) %>% # 标记90天内再次入院的记录:时间差小于等于90天标记为1,没有下一次就诊标记为0 mutate(is_90d_readmission = ifelse(readmission_interval <= 90 & !is.na(readmission_interval), 1, 0)) %>% # 取消分组 ungroup() # 筛选所有导致90天内再入院的就诊记录 target_visits <- filter(result, is_90d_readmission == 1)
如果需要用基础R实现,你可以用split()按Id拆分数据,对每个子数据集单独排序后计算相邻行的时间差,再合并结果即可。
内容的提问来源于stack exchange,提问作者catinabottle
相关产品推荐
相关产品推荐

