0

我有在数据集中使用日期的复杂问题。让我描述问题并举例说明。

数据是医院数据,其中我们有人员获得最终诊断时的信息(key_date)和人员住院时的事件数据(date_in,date_out)。

library(tidyverse)

sample_size = 1000
d <- tibble(id = seq(1, sample_size, 1), 
           key_date = sample(seq(as.Date('2004/01/01'), as.Date('2009/01/01'), by="day"), sample_size, replace = T),
           date_in = sample(seq(as.Date('1999/01/01'), as.Date('2005/01/01'), by="day"), sample_size, replace = T)) %>% 
  mutate(
    date_out = date_in + sample(seq(1,20, 1), sample_size, replace = T)    
  )
d


# A tibble: 1,000 x 4
      id key_date   date_in    date_out  
   <dbl> <date>     <date>     <date>    
 1     1 2004-12-11 1999-08-03 1999-08-16
 2     2 2007-04-07 2002-10-29 2002-11-07
 3     3 2006-11-04 2002-07-10 2002-07-14
 4     4 2008-05-17 2001-08-14 2001-08-21
 5     5 2006-10-23 2004-06-17 2004-07-04
 6     6 2004-12-22 2002-02-27 2002-03-06
 7     7 2007-01-13 2001-05-27 2001-06-14
 8     8 2005-01-11 1999-09-17 1999-09-24
 9     9 2008-04-06 2000-10-05 2000-10-07
10    10 2007-03-15 1999-06-13 1999-06-23

我们希望将所有患者放在同一时间线中,以便在新的规模中,每个人都在点 0 进行诊断。与此相关,我们还将 date_in 和 date_out 变量缩放到该时间线。

d <- d %>% 
  mutate(date_in_new = date_in - key_date + 1,
         date_out_new = date_out - key_date) 

d
# A tibble: 1,000 x 6
      id key_date   date_in    date_out   date_in_new date_out_new
   <dbl> <date>     <date>     <date>     <drtn>      <drtn>      
 1     1 2004-12-11 1999-08-03 1999-08-16 -1956 days  -1944 days  
 2     2 2007-04-07 2002-10-29 2002-11-07 -1620 days  -1612 days  
 3     3 2006-11-04 2002-07-10 2002-07-14 -1577 days  -1574 days  
 4     4 2008-05-17 2001-08-14 2001-08-21 -2467 days  -2461 days  
 5     5 2006-10-23 2004-06-17 2004-07-04  -857 days   -841 days  
 6     6 2004-12-22 2002-02-27 2002-03-06 -1028 days  -1022 days  
 7     7 2007-01-13 2001-05-27 2001-06-14 -2056 days  -2039 days  
 8     8 2005-01-11 1999-09-17 1999-09-24 -1942 days  -1936 days  
 9     9 2008-04-06 2000-10-05 2000-10-07 -2739 days  -2738 days  
10    10 2007-03-15 1999-06-13 1999-06-23 -2831 days  -2822 days  

接下来我们要计算诊断前 1 年、2 年等有多少患者住院。例如,前 3 行原始数据的数据如下所示:

year; days; patients
-6; 13; 1
-5; 13; 2

这意味着天数被计算为医院人员在新的缩放日期变量中的天数。同一“事件”有可能被划分为两年或更多年。年在这里表示 365 天,此参考表有助于了解每年的天数限制:

year; day_limits
2; c(730, 1094)
1; c(365, 729)
0; c(0, 364)
-1; c(-1 , -365)
-2; c(-366, -730)
-3; c(-731, -1095)
-4; c(-1096, -1460)
-5; c(-1461, -1825)
-6; c(-1826, -2190)

进行此计算的最佳和最快方法是什么?我知道这可以通过 for-loop 遍历整个数据集并检查哪些行标识为年份来完成,但我发现它很慢。想法是获取带有变量的数据框

  • 年份:根据时间线变化。1,2,3,4,… 诊断前 1,2,3,4,… 年诊断后
  • 病人:不同的身份在医院里有多么不同
  • 天数:患者一年中住院天数

这种数据争论的整个想法是在“真正”诊断之前可视化患者住院天数的增长情况。最有可能的真实数据看起来像这样

在此处输入图像描述

4

0 回答 0