【问题标题】:Obtaining average inter-purchase time with all dates in one column in R在R中的一列中获取所有日期的平均购买间时间
【发布时间】:2017-05-03 14:40:14
【问题描述】:

我目前正在为 R 中的流失数据集制定时间表。按顺序 为此,我需要每个客户的平均购买间时间。

下面的示例数据显示了两个客户(客户 1 和 2)分别在 3 次和 2 次不同的场合购买。客户 1 的平均购买时间为 7.5 天 ((9+6)/2),客户 2 的平均购买时间仅为 5 天,因为该客户只有两个观察值。在代码中它看起来像这样:

df <- data.frame(cust_id=c(1,2,1,2,1), 
    order_date=as.Date(c("2012-8-14", "2012-7-1", "2012-8-23", "2012-7-6" 
    "2012-8-29")))

在图形上看起来像这样:

    cust_id    order_date
1   1          2012-8-14 
2   2          2012-7-1
3   1          2012-8-23
4   2          2012-7-6
5   1          2012-8-29

最终我希望它看起来像这样:

    cust_id    avg_interpurchase_time
1   1          7.5 
2   2          5

有人能指出我正确的方向吗?

谢谢!

附:我看过以下帖子:Calculating Inter-purchase Time in R 但我相信我的问题与那里提出的问题不同。我将所有日期放在一列中,一位客户最多可以有 80 个日期,而发帖的人为每个客户只有两个日期,分布在 2 列中。

【问题讨论】:

    标签: r time crm


    【解决方案1】:

    Mayeb 使用 dplyr:

    df %>% group_by(cust_id) %>% summarise(avg_internetpurchase_time = mean(diff(order_date)))
    

    【讨论】:

      【解决方案2】:

      在基础 R 中,您可以将 aggregate 与自定义函数一起使用:

      aggregate(order_date ~ cust_id, data=df, FUN=function(x) mean(diff(x)))
        cust_id order_date
      1       1       7.5 
      2       2       5.0 
      

      在这里,我们按订单日期取差值,然后计算平均值。请注意,这要求数据按日期排序。您可以通过在对 data.frame 的调用中包含 order 来确保这是真的,例如在 data=df[order(df$order_date),] 中。

      数据
      包括一些来自 OP 的错字更正。

      df <- 
      structure(list(cust_id = c(1, 2, 1, 2, 1), order_date = structure(c(15566, 
      15522, 15575, 15527, 15581), class = "Date")), .Names = c("cust_id", 
      "order_date"), row.names = c(NA, -5L), class = "data.frame")
      

      【讨论】:

      • 谢谢!这解决了我的问题。对错别字表示歉意并感谢您修复它们!
      【解决方案3】:

      与其他答案类似,但包括排序(排列)

      library(dplyr)
      df %>%
        group_by(cust_id)  %>%
        arrange(order_date) %>%
        mutate(t = order_date - lag(order_date)) %>%
        summarize(avg_interpurchase_time = mean(t, na.rm=T))
      

      【讨论】:

        【解决方案4】:

        这是dplyr 解决方案。请注意,您在第二次购买 cust_id 2 的年份打错了字。因此它的平均值为 371 而不是 5。

        library(dplyr)
        df %>% group_by(cust_id) %>% arrange(order_date) %>% mutate(dif = order_date - lag(order_date)) %>% 
          summarise(avg_purchase = mean(dif, na.rm = TRUE))
        

        【讨论】:

        • 非常感谢您的回复!感谢您也发现了错字,我会编辑它。恐怕我的例子对整个数据集的代表性不够。例如,使用您提供的代码,我得到以下日期的客户的平均购买时间为 -48.5:2015-09-03、2014-09-08、2015-05-29(按确切顺序当数据按 cust_id 分组时)。然而,这应该是 180 (263+97)/2。知道为什么会这样吗?
        • 我假设您的数据集已经按照示例进行了排序。我添加了排序,是什么让我的答案与 Epi99 的答案相同。
        猜你喜欢
        • 2023-03-26
        • 2012-12-04
        • 2013-11-09
        • 1970-01-01
        • 2018-10-28
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        • 1970-01-01
        相关资源
        最近更新 更多