我有一个长格式的数据集,其中包含多个病人的id
和多个start
和end
日期。日期代表医院入院和出院时间。有些病人在医院有多次重叠的住院,有些则没有重叠的住院,还有一些情况是start
(入院)和end
(出院)日期相同。
在此文的基础上,使用滞后的start
日期和cummax
函数,我希望做三件事:
- 对于开始和结束日期重叠的情况,合并这些案例,保留最早的开始日期和最后的结束日期。
- 对于开始和结束日期相同的情况,保持该观察结果不变(不合并)。
- 创建一个新变量,计算手术病房(surg)中最大天数,对于合并和非合并的案例都要计算。
我有如下数据:
id start end surg
1 A 2013-01-01 2013-01-05 0
2 A 2013-01-08 2013-01-12 1
3 A 2013-01-10 2013-01-14 6
4 A 2013-01-20 2013-01-20 3
5 B 2013-01-15 2013-01-25 4
6 B 2013-01-20 2013-01-22 5
7 B 2013-01-28 2013-01-28 0
我尝试过的:
library(dplyr)
data %>%
arrange(data, id, start) %>%
group_by(id) %>%
mutate(indx = c(0, cumsum(as.numeric(lead(start)) >
cummax(as.numeric(end)))[-n()])) %>%
group_by(id, indx) %>%
summarise(start = first(start), end = last(end), surgdays = max(surg))
我得到的内容:
id indx start end surgdays
1 A 0 2013-01-01 2013-01-05 0
2 A 1 2013-01-08 2013-01-14 7
3 A 2 2013-01-20 2013-01-20 3
问题:这段代码检查的行数受到数据集中列数的限制。例如,对于4个变量/列,它仅适用于前4行数据(包括合并两个具有重叠日期的行),然后停止……尽管示例中有7行数据(实际数据集中有成千上万行数据)。同样地,当我尝试在70列(和数百行)上使用相同的代码时,它会合并重叠的日期,但仅基于前70行数据。我的初步想法是创建与数据集中观测值数量一样多的占位符列,但这是一个笨拙的解决方法。 我希望得到的结果:
id indx start end surgdays
1 A 0 2013-01-01 2013-01-05 0
2 A 1 2013-01-08 2013-01-14 7
3 A 2 2013-01-20 2013-01-20 3
4 B 0 2013-01-15 2013-01-22 9
5 B 1 2013-01-28 2013-01-28 0
foverlaps
或从data.table
中搜索“非等连接”。 - MichaelChirico