获得R中一列中所有日期的平均购买时间

时间:2017-05-02 12:23:34

标签: r time crm

我目前正在为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

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

谢谢!

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

4 个答案:

答案 0 :(得分:2)

Mayeb使用dplyr:

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

答案 1 :(得分:1)

在基础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")

答案 2 :(得分:0)

这是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))

答案 3 :(得分:0)

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

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))