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

R中对比相邻行出入院日期差累计计算患者住院次数的实现方法

问题

原标题表述不够准确,实际需求更为复杂:我需要对比相邻两行不同变量的取值差异,且将计算得到的标记同步到后续所有对应行。
我手头有任职医院的患者出入院记录,患者住院期间可能会在不同科室流转(例如急诊转重症监护室)。
我需要统计每位患者实际出院后再返回医院的次数。
统计逻辑为:对比当前行的入院日期与上一行的出院日期,若二者相等则属于同一次住院,若不等则属于新的一次住院。
我的英文水平有限,下面给出示例说明需求。

示例

我平时使用data.table处理数据,你也可以给出dplyr版本的实现,我可以自行转换。

# ==== 引入依赖 ====
require(data.table)

# ==== 数据集构造 ====
## 包含患者ID、科室ID、入科日期、出科日期
patient_id <- c(rep(x = "0034280", 4), rep(x = "0002050", 2))
unit_id    <- c(c("azr", "grt", "chd", "grt"), c("tgo", "grt"))
date_entry <- c(c("2021-07-10", "2021-07-13", "2021-07-14", "2021-07-30"),c("2021-07-29", "2021-07-30"))
date_exit  <- c(c("2021-07-10", "2021-07-14", "2021-07-25", "2021-07-30"),c("2021-07-30", "2021-07-30"))

## 需要得到的结果字段
expected_result <- c(c(1,2,2,3), c(1,1))

## 预期最终输出
data_set <- data.table(patient_id, unit_id, date_entry, date_exit, expected_result)

可以看到,第2行的入院日期"2021-07-13"与第1行的出院日期"2021-07-10"不等,因此代表患者住院次数的预期结果字段值加1。

我的尝试

我首先给新增的统计字段赋初始值:

data_set <- data_set[
  j = stay_number := 1
]

之后我使用shift函数对比相邻行的取值:

data_set <- data_set[
  j = stay_number := data.table::fifelse(test = date_entry != data.table::shift(date_exit, type = "lag"),
                                        yes  = stay_number+1,
                                        no   = stay_number),
  by = patient_id
][
  j = stay_number := data.table::fifelse(test = base::is.na(stay_number),
                                        yes  = 1,
                                        no   = stay_number)
]

但我不知道怎么将值"2"同步到与第2行属于同一次住院的第3行,也无法正确计算出第4行对应的该患者第3次住院的编号。

解决方案

感谢Ronak Shah提供的实现方案:

data_set[, result := cumsum(date_entry != shift(date_exit, fill = FALSE)), patient_id]

内容的提问来源于stack exchange,提问作者Kévin Legueult

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:18:04