计算特定时间段内的发生次数
Calculate number of occurrences within a specific time period
我有以下数据,其中 ID 代表个人,Date 代表日期,Purchased 代表是否有人购买(我做了最后一个,以便我可以计算发生次数):
ID Date Purchased
1 1 2017-01-01 1
2 1 2017-08-03 1
3 1 2017-09-02 1
4 2 2017-09-04 1
5 2 2018-07-12 1
6 2 2018-11-03 1
7 2 2018-12-05 1
8 2 2019-01-01 1
9 3 2018-02-03 1
10 3 2020-02-03 1
11 3 2020-03-01 1
我想创建一个名为“Frequency”的变量,通过汇总您在数据框中看到的特定日期之前的所有“Purchased”来计算个人在过去一年中进行购买的次数.
例如,对于第 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 ))
我在 stackoverlow 上进行了搜索,但还没有找到可以应用到我的情况并获得所需结果的答案。我发现并尝试过的其中一件事是:
df$frequency <-
sapply(df$Date, function(x){
sum(df$Date < x & df$Date >= x - 365)
})
我相信如果我能找到一种方法来包含它按 ID 分组(因此它按 ID 求和而不是整体求和),这可能会给我想要的结果。当然不能肯定地说,因为我还没有能够测试出来。非常感谢任何帮助。
您可以将非相等连接与 data.table
:
结合使用
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
这是一个 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
代码的逻辑是每个 ID
中的每个 Date
它 sum
是当前日期 - 1 年和当前日期 - 1 之间的 Purchased
值天.
我有以下数据,其中 ID 代表个人,Date 代表日期,Purchased 代表是否有人购买(我做了最后一个,以便我可以计算发生次数):
ID Date Purchased
1 1 2017-01-01 1
2 1 2017-08-03 1
3 1 2017-09-02 1
4 2 2017-09-04 1
5 2 2018-07-12 1
6 2 2018-11-03 1
7 2 2018-12-05 1
8 2 2019-01-01 1
9 3 2018-02-03 1
10 3 2020-02-03 1
11 3 2020-03-01 1
我想创建一个名为“Frequency”的变量,通过汇总您在数据框中看到的特定日期之前的所有“Purchased”来计算个人在过去一年中进行购买的次数.
例如,对于第 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 ))
我在 stackoverlow 上进行了搜索,但还没有找到可以应用到我的情况并获得所需结果的答案。我发现并尝试过的其中一件事是:
df$frequency <-
sapply(df$Date, function(x){
sum(df$Date < x & df$Date >= x - 365)
})
我相信如果我能找到一种方法来包含它按 ID 分组(因此它按 ID 求和而不是整体求和),这可能会给我想要的结果。当然不能肯定地说,因为我还没有能够测试出来。非常感谢任何帮助。
您可以将非相等连接与 data.table
:
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
这是一个 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
代码的逻辑是每个 ID
中的每个 Date
它 sum
是当前日期 - 1 年和当前日期 - 1 之间的 Purchased
值天.