You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:18:02