R 在滑动 window 时间段内创建以前事件的统计

R to create a tally of previous events within a sliding window time period

任何人都可以帮助我解决使用 R 创建特定时间段内以前事件总和的问题吗?如果我不遵守协议,我深表歉意,这是我在这里的第一个问题。

我有一个 ID 和事件日期的 df。在真正的 df 中,事件是日期时间,但为了简单起见,我在这里使用了日期。

我正在尝试创建一个变量,该变量是过去 2 年内该 ID 号(或 750 天,因为我不太关心闰年,但考虑因素中).

还有一个问题是有些ID会在同一日期(和正版df中的时间)有多个事件。我不想删除这些,因为在真实的 df 中还有一个不一定相同的附加变量。但是,总而言之,我想计算与一个事件在同一日期发生的事件,即如果一个 ID 只有 2 个事件但它们在同一天发生,则结果将为 0,或者前一个日期中可能有 3 行日期2 年的 ID - 但由于两个日期相同,结果是 2。我创建了一个结果向量来举例说明在 ID 7 有这个例子之后我所拥有的。

如果同一天有 3 个先前事件,则结果总和将为 1,并且 2 年内的任何后续事件

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

我尝试了各种 if else 和 lag() 的使用,但无法得到我想要的东西

谢谢。

这是 data.table 的解决方案。

要从 event.date 中减去 2 年,您可以使用 lubridate 并减去 years(2)

在将 by IDevent.date 分组后,您可以将所有介于 2 年前和日期(incbounds of 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