使用滞后开始时间将重叠的时间段合并,并保留合并案例中的变量?

4

我有一个长格式的数据集,其中包含多个病人的id和多个startend日期。日期代表医院入院和出院时间。有些病人在医院有多次重叠的住院,有些则没有重叠的住院,还有一些情况是start(入院)和end(出院)日期相同。

此文的基础上,使用滞后的start日期和cummax函数,我希望做三件事:

  1. 对于开始和结束日期重叠的情况,合并这些案例,保留最早的开始日期和最后的结束日期。
  2. 对于开始和结束日期相同的情况,保持该观察结果不变(不合并)。
  3. 创建一个新变量,计算手术病房(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

1
你可能想要查看 foverlaps 或从 data.table 中搜索“非等连接”。 - MichaelChirico
1
要指出一种解决方案,您可以访问此帖子。最后一个函数(在EDIT2中)基于14天规则聚合时间连续性。通过删除“-14”,您应该能够得到所需的结果,不包括您问题的第3点。 - Patrik_P
1个回答

0

这种有用的方法最初是由@David Arenburg 在此处发布的,如果我从操作序列中删除arrange()语句,则可以很好地使用(适用于所有情况):

 data %>%
      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))

我发现这种方法对于捕获折叠案例中的其他变量也很有帮助,例如最早医院就诊时的入院诊断。只需添加到summarise()语句中:

summarise(start = first(start), end = last(end), admit_diagnosis = first(diagnosis), surgdays = max(surg))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接