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
ID
和 event.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
任何人都可以帮助我解决使用 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
ID
和 event.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