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
相关产品推荐
相关产品推荐

