R 计算特定时间段内发生的次数

R 计算特定时间段内发生的次数,r,frequency,R,Frequency,我有以下数据,其中ID代表个人,日期代表日期,购买是否有人购买(我做了最后一个,以便我可以计算发生次数): 我想创建一个名为“频率”的变量,通过将数据框中显示的特定日期之前的所有“已购买”相加,计算个人在过去一年中进行购买的次数 例如,对于第3行,这将导致“频率”为2,因为2017-01-01和2017-08-03都在2017-09-02的一年时间内(因此在2016-09-02和2017-09-01的间隔内)。 参见所需输出: ID Date Purchased Frequen

我有以下数据,其中ID代表个人,日期代表日期,购买是否有人购买(我做了最后一个,以便我可以计算发生次数):

我想创建一个名为“频率”的变量,通过将数据框中显示的特定日期之前的所有“已购买”相加,计算个人在过去一年中进行购买的次数

例如,对于第3行,这将导致“频率”为2,因为
2017-01-01
2017-08-03
都在
2017-09-02
的一年时间内(因此在
2016-09-02
2017-09-01
的间隔内)。
参见所需输出:

   ID       Date Purchased Frequency
1   1 2017-01-01         1         0
2   1 2017-08-03         1         1
3   1 2017-09-02         1         2
4   2 2017-09-04         1         0
5   2 2018-07-12         1         1
6   2 2018-11-03         1         1
7   2 2018-12-05         1         2
8   2 2019-01-01         1         3
9   3 2018-02-03         1         0
10  3 2020-02-03         1         0
11  3 2020-03-01         1         1
要复制数据帧,请执行以下操作:

df <- data.frame(ID = c(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3), Date = as.Date(c('2017-01-01', '2017-08-03', '2017-09-02', '2017-09-04', '2018-07-12', '2018-11-03', '2018-12-05', '2019-01-01', '2018-02-03', '2020-02-03', '2020-03-01')), Purchased = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ))

df您可以对
数据使用非等联接。表

library(data.table)

setDT(df)
df[,c("Date","Before"):=.(as.Date(Date),as.Date(Date)-365)]
df[df,.(ID, Date),on=.(ID=ID, Date>=Before, Date<=Date)][,.N-1,by=.(ID,Date)]

   ID       Date V1
 1:  1 2017-01-01  0
 2:  1 2017-08-03  1
 3:  1 2017-09-02  2
 4:  2 2017-09-04  0
 5:  2 2018-07-12  1
 6:  2 2018-11-03  1
 7:  2 2018-12-05  2
 8:  2 2019-01-01  3
 9:  3 2018-02-03  0
10:  3 2020-02-03  0
11:  3 2020-03-01  1
库(data.table)
setDT(df)
df[,c(“日期”,“之前”):=(截止日期(日期),截止日期(日期)-365)]

df[df,(ID,Date),on=(ID=ID,Date>=Before,Date这是一个
tidyverse
解决方案:

library(dplyr)
library(purrr)
library(lubridate)

df %>%
  group_by(ID) %>%
  mutate(Frequency = map_dbl(Date, 
                     ~sum(Purchased[between(Date, .x - years(1), .x - 1)]))) %>%
  ungroup

#      ID Date       Purchased Frequency
#   <dbl> <date>         <dbl>     <dbl>
# 1     1 2017-01-01         1         0
# 2     1 2017-08-03         1         1
# 3     1 2017-09-02         1         2
# 4     2 2017-09-04         1         0
# 5     2 2018-07-12         1         1
# 6     2 2018-11-03         1         1
# 7     2 2018-12-05         1         2
# 8     2 2019-01-01         1         3
# 9     3 2018-02-03         1         0
#10     3 2020-02-03         1         0
#11     3 2020-03-01         1         1
库(dplyr)
图书馆(purrr)
图书馆(lubridate)
df%>%
分组依据(ID)%>%
变异(频率=map_dbl(日期,
~sum(购买[日期,.x年(1),.x-1)])%>%
解组
#身份证日期购买频率
#                  
# 1     1 2017-01-01         1         0
# 2     1 2017-08-03         1         1
# 3     1 2017-09-02         1         2
# 4     2 2017-09-04         1         0
# 5     2 2018-07-12         1         1
# 6     2 2018-11-03         1         1
# 7     2 2018-12-05         1         2
# 8     2 2019-01-01         1         3
# 9     3 2018-02-03         1         0
#10     3 2020-02-03         1         0
#11     3 2020-03-01         1         1

代码的逻辑是针对每个
日期
在每个
ID中
总和
s当前日期-1年和当前日期-1天之间购买的
价值。

亲爱的Ronak Shah,我可以要求您对代码的机制进行简要的解释吗。这是一个绝妙的想法,但我无法理解它是如何处理日期列上的迭代的。提前非常感谢。实际上,它很简单。对于每个
日期
,它将去年和当前日期之间购买的
值相加。
library(data.table)

setDT(df)
df[,c("Date","Before"):=.(as.Date(Date),as.Date(Date)-365)]
df[df,.(ID, Date),on=.(ID=ID, Date>=Before, Date<=Date)][,.N-1,by=.(ID,Date)]

   ID       Date V1
 1:  1 2017-01-01  0
 2:  1 2017-08-03  1
 3:  1 2017-09-02  2
 4:  2 2017-09-04  0
 5:  2 2018-07-12  1
 6:  2 2018-11-03  1
 7:  2 2018-12-05  2
 8:  2 2019-01-01  3
 9:  3 2018-02-03  0
10:  3 2020-02-03  0
11:  3 2020-03-01  1
library(dplyr)
library(purrr)
library(lubridate)

df %>%
  group_by(ID) %>%
  mutate(Frequency = map_dbl(Date, 
                     ~sum(Purchased[between(Date, .x - years(1), .x - 1)]))) %>%
  ungroup

#      ID Date       Purchased Frequency
#   <dbl> <date>         <dbl>     <dbl>
# 1     1 2017-01-01         1         0
# 2     1 2017-08-03         1         1
# 3     1 2017-09-02         1         2
# 4     2 2017-09-04         1         0
# 5     2 2018-07-12         1         1
# 6     2 2018-11-03         1         1
# 7     2 2018-12-05         1         2
# 8     2 2019-01-01         1         3
# 9     3 2018-02-03         1         0
#10     3 2020-02-03         1         0
#11     3 2020-03-01         1         1