我有一个包含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的代码,但没有运气。建议欢迎!
答案 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