假设汤姆在周一和周五下了两个订单。但是我想找出一种有效的方法来为Tue,Wed,Thu插入无购买数据,这些数据在我的数据中不存在,因此我可以计算Tom每天的累计总支出。
我目前的代码是创建一个庞大的用户日期(完整日期,从2010年至2011年);通过完全合并将它们与现有数据合并;填写缺失值;计算cumsum。
user<-c("Tom","Tom","Jim","Jim")
order_time<-c("2018-01-01", "2018-01-04", "2018-01-02","2018-01-04")
total_spending<-c(20,80,50,60)
dt<-data.frame(user,order_time,total_spending)
> dt
user order_time total_spending
1 Tom 2018-01-01 20
2 Tom 2018-01-04 80
3 Jim 2018-01-02 50
4 Jim 2018-01-04 60
期望的输出
user order_time total_spending cumulative_spending
1 Tom 2018-01-01 20 20
2 Tom 2018-01-02 0 20
3 Tom 2018-01-03 0 20
4 Tom 2018-01-04 80 100
5 Jim 2018-01-02 50 50
6 Jim 2018-01-03 0 50
7 Jim 2018-01-04 60 110
答案 0 :(得分:2)
dt %>%
mutate(order_time = as.Date(order_time)) %>%
group_by(user) %>%
complete(order_time =seq.Date(min(order_time), max(order_time), by="day")) %>%
replace_na(list(total_spending = 0)) %>%
mutate(cumulative_spending = cumsum(total_spending))
输出:
# A tibble: 7 x 4
# Groups: user [2]
user order_time total_spending cumulative_spending
<fct> <date> <dbl> <dbl>
1 Jim 2018-01-02 50. 50.
2 Jim 2018-01-03 0. 50.
3 Jim 2018-01-04 60. 110.
4 Tom 2018-01-01 20. 20.
5 Tom 2018-01-02 0. 20.
6 Tom 2018-01-03 0. 20.
7 Tom 2018-01-04 80. 100.