为组创建累积时间数据

时间:2018-05-17 08:36:37

标签: r date dataframe dplyr data.table

我有一个包含ID' s,事件日期,日期的数据框。

timeyrs = endate - startdate

eventyr = eventdate - startdate

注意:我已将这些数字四舍五入。

df1

ID  eventdate   startdate   enddate     timeyrs eventyr
1   20-10-2007  16-06-2003  21-07-2017  14.1  4.34
1   11-11-08    16-06-2003  21-07-2017  14.1  5.41
1   26-09-2012  16-06-2003  21-07-2017  14.1  9.28
2   11-05-2014  20-04-2012  16-06-2017  5.2   2.06
3   11-04-2017  6-02-2015   21-04-2017  2.2   2.18

我想将整个数据集的数据汇总成多年的跟进数据。即每年1排(约20年)。

df2创建:

Year cmltime cmlevent
1   3   0
2   3   0
3   2.2 2
4   2   0
5   2   1
6   1.2 1
7   1   0
8   1   0
9   1   0
10  1   1
11  1   0
12  1   0
13  1   0
14  1   0
15  0.1 0

累积时间 - 这是该年度可用的数据量,例如。第一年,有3个ID提供了一整年的数据,最后只有1年的6-14年的数据。

对于累积事件,这是该跟进年度中出现的通风口的总和。例如。 ID" s 2和3在其数据的第3年中发生了事件。

到目前为止,我一直在试用来自dplyr的代码,但没有运气。建议欢迎!

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么OP希望为每个ID创建一个自己的时间标度,其中第一年分别从startdate开始。最后,结果将汇总多年。

以下是结合data.table语法进行分组和聚合以及magrittr管道进行算术的代码。 (顺便说一句,利用magrittr丰富的管道功能是一个很好的练习。)

library(data.table)
library(magrittr)
cml_by_ID <- DT[, {
  cmltime <- seq(min(startdate), max(enddate), by = "year") %>% 
    append(max(enddate)) %>% 
    diff() %>% 
    as.numeric() %>% 
    divide_by(365.25) %>% 
    round(1)
  year <- cmltime %>% seq_along()
  cmlevent <- year %>% 
    is_in(
      eventdate %>% 
        subtract(min(startdate)) %>% 
        as.numeric() %>% 
        divide_by(365.25) %>% 
        ceiling()
    ) %>% 
    as.integer()
  list(year = year, cmltime = cmltime, cmlevent = cmlevent)
  }, 
  by = ID]

核心思想是创建一个以startdate开头的年度日期序列,并附加enddate并计算以年为单位的差异。因此,cmltime包含观察时间的年度贡献份额(除上一年外,大多数为1.0)。 year仅计入cmltime中。最后,确定事件发生的年份。在那几年cmlevent设置为一。

每个ID的结果被合并到一个数据对象中

cml_by_ID
    ID year cmltime cmlevent
 1:  1    1     1.0        0
 2:  1    2     1.0        0
 3:  1    3     1.0        0
 4:  1    4     1.0        0
 5:  1    5     1.0        1
 6:  1    6     1.0        1
 7:  1    7     1.0        0
 8:  1    8     1.0        0
 9:  1    9     1.0        0
10:  1   10     1.0        1
11:  1   11     1.0        0
12:  1   12     1.0        0
13:  1   13     1.0        0
14:  1   14     1.0        0
15:  1   15     0.1        0
16:  2    1     1.0        0
17:  2    2     1.0        0
18:  2    3     1.0        1
19:  2    4     1.0        0
20:  2    5     1.0        0
21:  2    6     0.2        0
22:  3    1     1.0        0
23:  3    2     1.0        0
24:  3    3     0.2        1
    ID year cmltime cmlevent

最后,这是每年的汇总:

cml_by_ID[, lapply(.SD, sum), .SDcols = c("cmltime", "cmlevent"), by = year]
    year cmltime cmlevent
 1:    1     3.0        0
 2:    2     3.0        0
 3:    3     2.2        2
 4:    4     2.0        0
 5:    5     2.0        1
 6:    6     1.2        1
 7:    7     1.0        0
 8:    8     1.0        0
 9:    9     1.0        0
10:   10     1.0        1
11:   11     1.0        0
12:   12     1.0        0
13:   13     1.0        0
14:   14     1.0        0
15:   15     0.1        0

数据

library(data.table)
DT <- fread(
  "ID  eventdate   startdate   enddate     timeyrs eventyr
1   20-10-2007  16-06-2003  21-07-2017  14.1  4.34
1   11-11-08    16-06-2003  21-07-2017  14.1  5.41
1   26-09-2012  16-06-2003  21-07-2017  14.1  9.28
2   11-05-2014  20-04-2012  16-06-2017  5.2   2.06
3   11-04-2017  6-02-2015   21-04-2017  2.2   2.18",
  select = 1:4
)
# convert date strings to Date class
cols <- names(DT)[names(DT) %like% "date$"]
DT[, (cols) := lapply(.SD, lubridate::dmy), .SDcols = cols]
DT
   ID  eventdate  startdate    enddate
1:  1 2007-10-20 2003-06-16 2017-07-21
2:  1 2008-11-11 2003-06-16 2017-07-21
3:  1 2012-09-26 2003-06-16 2017-07-21
4:  2 2014-05-11 2012-04-20 2017-06-16
5:  3 2017-04-11 2015-02-06 2017-04-21