Warm tip: This article is reproduced from serverfault.com, please click

if statement-R在滑动窗口时间段内创建先前事件的计数

(if statement - R to create a tally of previous events within a sliding window time period)

发布于 2020-11-28 00:14:25

请问有人能够使用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(),但无法获得我想要的东西

谢谢你。

Questioner
Lewis P-M
Viewed
11
Ben 2020-11-30 01:26:12

这是的解决方案data.table

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

分组后by两者IDevent.date,你可以子集2年前下降之间的所有日期和(日期incboundsbetween将排除的上限和下限)。

使用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