R - 为重复购买分组日期和汇总数据

时间:2015-05-26 07:20:03

标签: r group-by datediff date-difference

我正在尝试对客户的重复购买行为进行分析。

我的目标是双重的:

  1. 消除仅发生一次的所有客户商品zip组合(消除不重复的)
  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函数,但由于DATEDIFF R无效,我无法使用 <ul> <li ng-repeat="ls in list" ng-class="{ 'active' : ls == selectedItem }" ng-click="activeMenu(ls)">{{ls}}</li> </ul>

    有人可以帮助我在这里采取更好的方法吗?

1 个答案:

答案 0 :(得分: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