【问题标题】:R - Grouping Dates and Summarizing Data for repeat purchaseR - 分组日期和汇总数据以进行重复购买
【发布时间】:2015-08-07 17:47:18
【问题描述】:

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

我的目标有两个:

  1. 消除所有仅出现一次的客户项目 zip 组合(消除非重复的)
  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

有人可以帮我找到更好的方法吗?

【问题讨论】:

  • 你如何计算 Tot Ord?
  • 感谢您对 akrun 的帮助。对于 Tot Ord,我之前在表格中犯了一个错误。我现在已经更正了。它实际上是 Customer、Item、Zip 组合重复的次数。我在上表中更新了相同的内容。我也在寻找如何使用您共享的代码。再次感谢你。我会告诉你结果如何。
  • @ayshuku 我发布了评论作为答案。看起来它与预期的输出相匹配,除了第一个的 AvgDays 对我来说是 14,而你有 15
  • 这太完美了!!这对我很有用!!!谢谢你的帮助:)

标签: r group-by datediff date-difference


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-05-31
    • 2021-03-09
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多