2015-05-26 2 views
2

Я пытаюсь сделать анализ поведения покупателей по повторной покупке.R - Группировка дат и суммирующих данных для повторной покупки

Моя цель состоит в два раза:

  1. Ликвидировать все пункт клиента зип сочетание, которое происходит только один раз (исключить бесповторные из них)
  2. Для записей, которые повторяются, я хочу, чтобы суммировать то же самое, когда мне нужно, чтобы получить среднее количество дней между несколькими заказами, а также общий объем продаж

Если у меня есть следующие данные:

Customer# Item  Zip  Date   Qty  Net Sales 
--------- -------- ----- ----------  ---  --------- 
ABC123  GHTH123  76137 2014-01-01  10  1500 
XYZ999  ZZZZZZZ  68106 2015-02-01  1  50 
DEF456  167AAAA  60018 2015-03-01  12  650 
XYZ999  YYYYYYY  68106 2015-01-01  3  150 
XYZ999  ZZZZZZZ  68106 2015-04-01  10  500 
XYZ999  YYYYYYY  68106 2015-03-01  12  600 
XYZ999  YYYYYYY  68106 2015-05-01  10  500 
ABC123  GHTH123  76137 2014-01-15  8  1200 
ABC234  N867689  23218 2014-01-01  10  1500 
ABC123  DDFF121  76137 2014-01-27  15  2250 

Я пытаюсь получить следующий вывод:

Customer# Item  Zip  Avg Days/Ord Tot Ord  Total Amt 
--------- -------- ----- ----------  -------  --------- 
ABC123  GHTH123  76137 15    2   2700 
XYZ999  ZZZZZZZ  68106 60    2   550 
XYZ999  YYYYYYY  68106 60    3   1250 

Я пытался использовать пакет sqldiff и использовать DATEDIFF функцию, но я не получаю нигде с этим, как DATEDIFF не работает для R.

Может ли кто-нибудь помочь мне с лучшим подходом здесь?

+1

Как рассчитать Tot Ord? – akrun

+0

Благодарим вас за помощь akrun. Для Tot Ord я сделал ошибку в таблице раньше. Я исправил то же самое сейчас. Фактически это количество раз, когда комбинация Customer, Item, Zip повторялась. Я обновил то же самое в таблице выше. Я также смотрю, как я могу использовать код, который вы поделили. Еще раз спасибо. Я дам вам знать, как это работает. – ayushku

+0

@ayshuku Я отправил комментарий в качестве ответа. Похоже, он соответствует ожидаемому результату, за исключением AvgDays для 1-го, что для меня 14, тогда как у вас есть 15 – akrun

ответ

1

Вы можете попробовать

library(dplyr) 
df1 %>% 
    group_by(Customer, Item, Zip) %>% 
    filter(n()>1) %>% 
    summarise(AvgDays=mean(diff(Date)),TotOrd= n(), TotAmt=sum(NetSales)) 
# Customer Item Zip AvgDays TotOrd TotAmt 
#1 ABC123 GHTH123 76137  14  2 2700 
#2 XYZ999 ZZZZZZZ 68106  59  2 550 
#3 XYZ999 YYYYYYY 68106  60  3 1250 

Или

library(data.table) 
setDT(df1)[, if(.N>1) list(AvgDays= mean(c(diff(Date))), TotOrd=.N, 
        TotAmt=sum(NetSales)), .(Customer, Item, Zip)] 
# Customer Item Zip AvgDays TotOrd TotAmt 
#1: ABC123 GHTH123 76137  14  2 2700 
#2: XYZ999 ZZZZZZZ 68106  59  2 550 
#3: XYZ999 YYYYYYY 68106  60  3 1250 
Смежные вопросы