【发布时间】:2017-05-27 17:24:00
【问题描述】:
这个问题是对我在here 发布的问题的修改,其中我在不同的日子出现了特定类型,但这次它们被分配给多个用户,例如:
df = data.frame(user_id = c(rep(1:2, each=5)),
cancelled_order = c(rep(c(0,1,1,0,0), 2)),
order_date = as.Date(c('2015-01-28', '2015-01-31', '2015-02-08', '2015-02-23', '2015-03-23',
'2015-01-25', '2015-01-28', '2015-02-06', '2015-02-21', '2015-03-26')))
user_id cancelled_order order_date
1 0 2015-01-28
1 1 2015-01-31
1 1 2015-02-08
1 0 2015-02-23
1 0 2015-03-23
2 0 2015-01-25
2 1 2015-01-28
2 1 2015-02-06
2 0 2015-02-21
2 0 2015-03-26
我要计算
1) 每位客户在接下来的 x 天(例如 7、14 天)将要取消的订单数,不包括当前一个和 p>
1) 每个客户在过去 x 天(例如 7、14 天)拥有的取消订单数量,不包括当前订单。
所需的输出如下所示:
solution
user_id cancelled_order order_date plus14 minus14
1 0 2015-01-28 2 0
1 1 2015-01-31 1 0
1 1 2015-02-08 0 1
1 0 2015-02-23 0 0
1 0 2015-03-23 0 0
2 0 2015-01-25 2 0
2 1 2015-01-28 1 0
2 1 2015-02-06 0 1
2 0 2015-02-21 0 0
2 0 2015-03-26 0 0
@joel.wilson 使用data.table 提出了非常适合此目的的solution
library(data.table)
vec <- c(14, 30) # Specify desired ranges
setDT(df)[, paste0("x", vec) :=
lapply(vec, function(i) sum(df$cancelled_order[between(df$order_date,
order_date,
order_date + i, # this part can be changed to reflect the past date ranges
incbounds = FALSE)])),
by = order_date]
但是,它不考虑按user_id 分组。当我尝试通过将此分组添加为by = c("user_id", "order_date") 或by = list(user_id, order_date) 来修改公式时,它不起作用。似乎这是非常基本的东西,关于如何绕过这个细节的任何提示?
另外,请记住,我正在寻找一个可行的解决方案,即使它根本不是基于上述代码或data.table!
谢谢!
【问题讨论】:
-
嗨,@Frank,谢谢,现在我添加了所需的输出,希望对您有所帮助
标签: r group-by data.table dplyr