请问有人能够使用R在特定时间段内创建以前事件的总和来解决我的问题吗?抱歉,如果我不遵守协议,这是我的第一个问题。
我有ID和活动日期的df。在真正的df中,事件是日期时间,但是为了简化起见,我在这里使用了日期。
我正在尝试创建一个变量,该变量是该ID编号(或750天,因为Im不太担心leap年,但是可以考虑在内)是过去2年中该事件的总数。
还有一个问题是,某些ID在同一日期(和真实df中的时间)会有多个事件。我不想删除这些,因为在真正的df中有一个附加变量,它不一定相同。但是,总的来说,我想计算与一个事件发生在同一日期的事件,即,如果一个ID只有2个事件,但它们在同一天,则结果将为0,或者前一个事件中可能有3行日期ID使用2年-但同一日期是2年,因此结果是2。我创建了一个结果向量,以举例说明ID 7提供了该示例之后的结果。
如果同一天有3个先前的事件,则结果总和为1,而两年内的任何后续事件
ID <- c(10,1,11,2,2,13,4,5,6,6,13,7,7,7,8,8,9,9,9,10,1,11,2,11,12,9,13,14,7,15,7)
event.date<-c('2018-09-09','2016-06-02','2018-08-20', '2018-11-03', '2018-07-10', '2017-03-08', '2018-06-16', '2017-05-20', '2016-04-02', '2016-07-27', '2018-07-15', '2018-06-15', '2018-06-15', '2018-01-16', '2017-10-07', '2016-08-17','2018-08-01','2017-01-22','2016-08-05', '2018-08-13', '2016-11-28', '2018-11-24','2016-06-01', '2018-03-26', '2017-02-04', '2017-12-01', '2016-05-16', '2017-11-25', '2018-04-01', '2017-09-21', '2018-04-01')
df<-data.frame(ID,event.date)
df<-df%>%
arrange(ID,event.date)
结果列应如下所示。
event.count <- c(0,1,0,0,1,0,0,0,1,0,1,1,2,2,0,1,0,1,2,3,0,1,0,1,2,0,0,1,1,0,0)
df$event.count<-event.count
我已经尝试了其他各种方法和使用lag(),但无法获得我想要的东西
谢谢你。
这是的解决方案data.table
。
要从中减去2年event.date
,你可以使用lubridate
和减去years(2)
。
分组后by
两者ID
与event.date
,你可以子集2年前下降之间的所有日期和(日期incbounds
的between
将排除的上限和下限)。
使用uniqueN
可以防止重复日期被多次计数。
library(data.table)
library(lubridate)
df$event.date <- as.Date(df$event.date)
setDT(df)[, new.event.count := uniqueN(df$event.date[df$ID == ID][
between(df$event.date[df$ID == ID],
event.date - years(2),
event.date,
incbounds = FALSE)]),
by = c("ID", "event.date")][]
输出
ID event.date event.count new.event.count
1: 1 2016-06-02 0 0
2: 1 2016-11-28 1 1
3: 2 2016-06-01 0 0
4: 2 2018-07-10 0 0
5: 2 2018-11-03 1 1
6: 4 2018-06-16 0 0
7: 5 2017-05-20 0 0
8: 6 2016-04-02 0 0
9: 6 2016-07-27 1 1
10: 7 2018-01-16 0 0
11: 7 2018-04-01 1 1
12: 7 2018-04-01 1 1
13: 7 2018-06-15 2 2
14: 7 2018-06-15 2 2
15: 8 2016-08-17 0 0
16: 8 2017-10-07 1 1
17: 9 2016-08-05 0 0
18: 9 2017-01-22 1 1
19: 9 2017-12-01 2 2
20: 9 2018-08-01 3 3
21: 10 2018-08-13 0 0
22: 10 2018-09-09 1 1
23: 11 2018-03-26 0 0
24: 11 2018-08-20 1 1
25: 11 2018-11-24 2 2
26: 12 2017-02-04 0 0
27: 13 2016-05-16 0 0
28: 13 2017-03-08 1 1
29: 13 2018-07-15 1 1
30: 14 2017-11-25 0 0
31: 15 2017-09-21 0 0
ID event.date event.count new.event.count