【发布时间】:2021-09-14 12:09:21
【问题描述】:
问题
标题具有误导性,因为它比这更复杂。我需要从 2 个不同的变量中找到 2 行之间的值差异,并且我还需要将该信息重复到下面的所有行。
我有一份病人名单,他们进出我工作的医院。有时,在住院期间,他们会从一个病房转移到另一个病房(例如急诊转重症监护)。
我想知道他们实际离开了多少时间然后又回到了医院。
要找到它,我只需要搜索进入日和前一个退出日之间的时间差。如果两者相等,那么这是相同的停留。如果他们不同,那就是另一个住宿。
用我的英语水平有点难以解释,所以我在下面给你举个例子。
示例
我使用data.table,但如果您愿意,可以使用dplyr。我应该可以轻松转换它。*
# ==== Library ====
require(data.table)
# ==== Data set ====
## The patient id, the unit id, and the entry and exit date from individuals unit
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"))
## The variable I want to get
expected_result <- c(c(1,2,2,3), c(1,1))
## Final result expected
data_set <- data.table(patient_id, unit_id, date_entry, date_exit, expected_result)
如您所见,由于第 2 行的“2021-07-13”与第 1 行的“2021-07-10”不同,因此表明该患者住院人数的预期结果有所增加。
我的尝试
首先,我开始为新变量创建一个基值
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”,因为它是该患者的第三次住院治疗。
解决方案
感谢罗纳克·沙阿!
data_set[, result := cumsum(date_entry != shift(date_exit, fill = FALSE)), patient_id]
【问题讨论】:
-
好吧,我相信我明白了,所以基本上你只想在开头为 date_exit 容器添加一些虚拟变量(或从 date_start 容器中删除第一个),然后减去 date_entry - date_exit。可能您必须使用一些日期差异函数(如
difftime)。在那里,您将能够将其与零进行比较,以检查剩余日期和日期输入之间是否存在差异。你是这个意思吗?
标签: r difference