在R中的一列中获取所有日期的平均购买时间
Obtaining average inter-purchase time with all dates in one column in R
我目前正在为 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。我查看了以下 post: Calculating Inter-purchase Time in R 但我相信我的问题与那里提出的问题不同。我将所有日期都放在一列中,一个客户最多可以有 80 个日期,而 posted 的人每个客户只有两个日期,分布在 2 列中。
Mayeb 使用 dplyr:
df %>% group_by(cust_id) %>% summarise(avg_internetpurchase_time = mean(diff(order_date)))
这里是 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))
在基础 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")
与其他答案类似,但包括排序(排列)
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))
我目前正在为 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。我查看了以下 post: Calculating Inter-purchase Time in R 但我相信我的问题与那里提出的问题不同。我将所有日期都放在一列中,一个客户最多可以有 80 个日期,而 posted 的人每个客户只有两个日期,分布在 2 列中。
Mayeb 使用 dplyr:
df %>% group_by(cust_id) %>% summarise(avg_internetpurchase_time = mean(diff(order_date)))
这里是 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))
在基础 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")
与其他答案类似,但包括排序(排列)
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))