2015-05-26 58 views
2

我正在嘗試分析客戶的重複購買行爲。R - 重複購買的分組日期和彙總數據

我的目標是雙重的:

  1. 消除一切只發生一次的客戶項目拉鍊組合(消除非重複的)
  2. 對於重複的記錄,我想總結同樣的,我需要得到總銷售額
  3. 多個訂單,也之間的天數平均

如果我擁有了以下數據:

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功能,但我不與R作爲DATEDIFF行不通的任何地方獲得。

有人可以幫助我更好的方法嗎?

+1

您是如何計算的托特奧德? – akrun

+0

謝謝你的幫助akrun。對於Tot Ord,我之前在表格中犯了一個錯誤。我現在糾正了相同的情況。它的實際次數是Customer,Item,Zip的組合重複次數。我已在上表中更新了相同的內容。我也在研究如何使用您分享的代碼。再次感謝你。我會讓你知道它是如何工作的。 – ayushku

+0

@ayshuku我發表評論作爲答案。看起來它與預期的輸出相匹配,除了第一個的AvgDays,對我來說是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