根据日期范围计算 运行 个平均值
Calculate running average based on date range
我有一个数据集,其中包含客户 ID、he/she 订购某物的日期和 his/her 发票值。下面的可重现示例:
client_id_ex<-c("0001","0001","0001","0001","0002","0002","0002","0002","0002","0002","0002")
order_date_ex<-as.Date(c("12-05-2000","02-01-2001","11-11-2020","03-05-2021","12-05-2000","16-05-2000","12-06-2000","13-08-2000","19-05-2004","12-09-2007","08-12-2008"),format="%d-%m-%Y")
invoice_ex<-c(450,100,200,330,543,665,334,753,234,541,1000)
df<-data.frame(client_id_ex,order_date_ex,invoice_ex)
我想为每个客户分别计算 运行 发票的平均值,并且对于每个订单之前不早于 5 年的订单,我正在计算平均值。
结果如下所示:
client_id_ex order_date_ex invoice_ex avg_invoice_5
1 12.05.2000 450 450
1 02.01.2001 100 275
1 11.11.2020 200 200
1 03.05.2021 330 265
2 12.05.2000 543 543
2 16.05.2000 665 604
2 12.06.2000 334 514
2 13.08.2000 753 574
2 19.05.2004 234 506
2 12.09.2007 541 388
2 08.12.2008 999 591
有人知道怎么做吗?我尝试使用: Calculate average based on date range in R ,但由于我必须计算更像移动平均线的东西并分别为每个客户执行此操作,因此我没有从这个例子中得到太多。
这是使用 tidyverse
的一种方法。它使用 purrr::map
取每个客户的发票在每个日期和五年前(5*365.25 天)日期之间的平均值。
library(tidyverse)
df %>%
group_by(client_id_ex) %>%
mutate(roll_mean = map_dbl(order_date_ex,
~mean(invoice_ex[(order_date_ex >= (. - 5 * 365.25)) &
(order_date_ex <= .)])))
# A tibble: 11 x 4
# Groups: client_id_ex [2]
client_id_ex order_date_ex invoice_ex roll_mean
<chr> <date> <dbl> <dbl>
1 0001 2000-05-12 450 450
2 0001 2001-01-02 100 275
3 0001 2020-11-11 200 200
4 0001 2021-05-03 330 265
5 0002 2000-05-12 543 543
6 0002 2000-05-16 665 604
7 0002 2000-06-12 334 514
8 0002 2000-08-13 753 574.
9 0002 2004-05-19 234 506.
10 0002 2007-09-12 541 388.
11 0002 2008-12-08 1000 592.
我认为您追求的是 累积 mean/average 而不是滚动 mean/average。
这是一个选项:
df %>%
group_by(client_id_ex) %>%
mutate(grp = cumsum(c(TRUE, (diff(order_date_ex) > 5 * 365)))) %>%
group_by(client_id_ex, grp) %>%
mutate(avg_invoice_5 = cummean(invoice_ex)) %>%
ungroup() %>%
select(-grp)
## A tibble: 11 x 4
# client_id_ex order_date_ex invoice_ex avg_invoice_5
# <chr> <date> <dbl> <dbl>
# 1 0001 2000-05-12 450 450
# 2 0001 2001-01-02 100 275
# 3 0001 2020-11-11 200 200
# 4 0001 2021-05-03 330 265
# 5 0002 2000-05-12 543 543
# 6 0002 2000-05-16 665 604
# 7 0002 2000-06-12 334 514
# 8 0002 2000-08-13 753 574.
# 9 0002 2004-05-19 234 506.
#10 0002 2007-09-12 541 512.
#11 0002 2008-12-08 1000 581.
我承认我不理解(也无法重现)最后两行的输出。我认为这是一个错误? client_id_ex = 0002
的所有发票日期都在 5 年之内。
我有一个数据集,其中包含客户 ID、he/she 订购某物的日期和 his/her 发票值。下面的可重现示例:
client_id_ex<-c("0001","0001","0001","0001","0002","0002","0002","0002","0002","0002","0002")
order_date_ex<-as.Date(c("12-05-2000","02-01-2001","11-11-2020","03-05-2021","12-05-2000","16-05-2000","12-06-2000","13-08-2000","19-05-2004","12-09-2007","08-12-2008"),format="%d-%m-%Y")
invoice_ex<-c(450,100,200,330,543,665,334,753,234,541,1000)
df<-data.frame(client_id_ex,order_date_ex,invoice_ex)
我想为每个客户分别计算 运行 发票的平均值,并且对于每个订单之前不早于 5 年的订单,我正在计算平均值。
结果如下所示:
client_id_ex order_date_ex invoice_ex avg_invoice_5
1 12.05.2000 450 450
1 02.01.2001 100 275
1 11.11.2020 200 200
1 03.05.2021 330 265
2 12.05.2000 543 543
2 16.05.2000 665 604
2 12.06.2000 334 514
2 13.08.2000 753 574
2 19.05.2004 234 506
2 12.09.2007 541 388
2 08.12.2008 999 591
有人知道怎么做吗?我尝试使用: Calculate average based on date range in R ,但由于我必须计算更像移动平均线的东西并分别为每个客户执行此操作,因此我没有从这个例子中得到太多。
这是使用 tidyverse
的一种方法。它使用 purrr::map
取每个客户的发票在每个日期和五年前(5*365.25 天)日期之间的平均值。
library(tidyverse)
df %>%
group_by(client_id_ex) %>%
mutate(roll_mean = map_dbl(order_date_ex,
~mean(invoice_ex[(order_date_ex >= (. - 5 * 365.25)) &
(order_date_ex <= .)])))
# A tibble: 11 x 4
# Groups: client_id_ex [2]
client_id_ex order_date_ex invoice_ex roll_mean
<chr> <date> <dbl> <dbl>
1 0001 2000-05-12 450 450
2 0001 2001-01-02 100 275
3 0001 2020-11-11 200 200
4 0001 2021-05-03 330 265
5 0002 2000-05-12 543 543
6 0002 2000-05-16 665 604
7 0002 2000-06-12 334 514
8 0002 2000-08-13 753 574.
9 0002 2004-05-19 234 506.
10 0002 2007-09-12 541 388.
11 0002 2008-12-08 1000 592.
我认为您追求的是 累积 mean/average 而不是滚动 mean/average。
这是一个选项:
df %>%
group_by(client_id_ex) %>%
mutate(grp = cumsum(c(TRUE, (diff(order_date_ex) > 5 * 365)))) %>%
group_by(client_id_ex, grp) %>%
mutate(avg_invoice_5 = cummean(invoice_ex)) %>%
ungroup() %>%
select(-grp)
## A tibble: 11 x 4
# client_id_ex order_date_ex invoice_ex avg_invoice_5
# <chr> <date> <dbl> <dbl>
# 1 0001 2000-05-12 450 450
# 2 0001 2001-01-02 100 275
# 3 0001 2020-11-11 200 200
# 4 0001 2021-05-03 330 265
# 5 0002 2000-05-12 543 543
# 6 0002 2000-05-16 665 604
# 7 0002 2000-06-12 334 514
# 8 0002 2000-08-13 753 574.
# 9 0002 2004-05-19 234 506.
#10 0002 2007-09-12 541 512.
#11 0002 2008-12-08 1000 581.
我承认我不理解(也无法重现)最后两行的输出。我认为这是一个错误? client_id_ex = 0002
的所有发票日期都在 5 年之内。