在不存在的日期之间插入累积值:

时间:2018-05-07 20:00:52

标签: r dplyr data-manipulation

假设汤姆在周一和周五下了两个订单。但是我想找出一种有效的方法来为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

1 个答案:

答案 0 :(得分:2)

您可以complete使用seq.Date

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.