我有在数据集中使用日期的复杂问题。让我描述问题并举例说明。
数据是医院数据,其中我们有人员获得最终诊断时的信息(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,… 年诊断后
- 病人:不同的身份在医院里有多么不同
- 天数:患者一年中住院天数
这种数据争论的整个想法是在“真正”诊断之前可视化患者住院天数的增长情况。最有可能的真实数据看起来像这样