Другой подход с использованием diff
library(dplyr)
df %>%
mutate(purchase_time = as.Date(purchase_time)) %>%
group_by(customer_id, product) %>%
mutate(diff = c(0, diff(purchase_time)))
# customer_id product purchase_time total_to_date time_from_last_purchase diff
# <int> <fct> <date> <int> <int> <dbl>
# 1 1 A 2014-11-24 1 0 0
# 2 1 A 2018-02-21 2 1185 1185
# 3 1 E 2014-01-08 1 0 0
# 4 2 J 2016-04-18 1 0 0
# 5 3 F 2017-06-12 1 0 0
# 6 3 G 2017-06-23 1 0 0
# 7 4 F 2017-09-27 1 0 0
# 8 4 F 2018-01-08 2 103 103
# 9 4 F 2018-02-08 3 31 31
#10 4 F 2018-02-09 4 1 1
#11 4 F 2018-04-10 5 60 60
Аналогично использованию базы R ave
мы можем сделать
df$diff <- with(df, ave(as.numeric(as.Date(purchase_time)), customer_id, product,
FUN = function(x) c(0, diff(x))))
Вы можете пропустить as.Date
часть в обоихподходит, если ваш purchase_time
уже имеет класс date
.