Рассчитать время от последней покупки среди той же покупки продукта - PullRequest
1 голос
/ 25 апреля 2019

Постановка задачи:

Вам предоставляются следующие данные:

  • Список customer_id
  • Список продукта
  • Время покупки
  • Общее количество покупки того же продукта на сегодняшний день

Найти:

  • Time_from_last_purchase среди одного и того же продукта

Ожидаемый результат (последний столбец):

customer_id product purchase_time  total_to_date  time_from_last_purchase
1              A      2014-11-24         1            0
1              A      2018-02-21         2            1185
1              E      2014-01-08         1            0
2              J      2016-04-18         1            0
3              F      2017-06-12         1            0 
3              G      2017-06-23         1            0 
4              F      2017-09-27         1            0
4              F      2018-01-08         2            103
4              F      2018-02-08         3            31
4              F      2018-02-09         4            1 
4              F      2018-04-10         5            60

Мой подход:

  • ЕслиЯ делаю это вручную, любой покупатель покупает определенный товар в первый раз, затем time_from_last_purchase равен 0.
  • Любой покупатель покупает товар со второго раза, тогда time_from_last_purchase будет равен time_purchase текущей покупки -time_purchase предыдущей покупки

Я новичок в R, поэтому любая помощь очень ценится.Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Другой подход с использованием 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.

0 голосов
/ 25 апреля 2019

С dplyr вы можете попробовать:

df %>%
 group_by(customer_id, product) %>%
 mutate(purchase_time = as.Date(purchase_time, format = "%Y-%m-%d"),
        res = purchase_time - lag(purchase_time, default = first(purchase_time)))

   customer_id product purchase_time total_to_date res      
         <int> <chr>   <date>                <int> <time>   
 1           1 A       2014-11-24                1    0 days
 2           1 A       2018-02-21                2 1185 days
 3           1 E       2014-01-08                1    0 days
 4           2 J       2016-04-18                1    0 days
 5           3 F       2017-06-12                1    0 days
 6           3 G       2017-06-23                1    0 days
 7           4 F       2017-09-27                1    0 days
 8           4 F       2018-01-08                2  103 days
 9           4 F       2018-02-08                3   31 days
10           4 F       2018-02-09                4    1 days
11           4 F       2018-04-10                5   60 days

Или, если вам нужны результаты в виде числовой переменной:

df %>%
 group_by(customer_id, product) %>%
 mutate(purchase_time = as.Date(purchase_time, format = "%Y-%m-%d"),
        res = as.numeric(purchase_time - lag(purchase_time, default = first(purchase_time))))

   customer_id product purchase_time total_to_date   res
         <int> <chr>   <date>                <int> <dbl>
 1           1 A       2014-11-24                1     0
 2           1 A       2018-02-21                2  1185
 3           1 E       2014-01-08                1     0
 4           2 J       2016-04-18                1     0
 5           3 F       2017-06-12                1     0
 6           3 G       2017-06-23                1     0
 7           4 F       2017-09-27                1     0
 8           4 F       2018-01-08                2   103
 9           4 F       2018-02-08                3    31
10           4 F       2018-02-09                4     1
11           4 F       2018-04-10                5    60
...