sqldf R - 订单之间的天数 - 按客户分组
sqldf R - days between orders - group by client
我想获取按客户分组的订单之间的平均时间。我想用 sqldf 库 R.
测试数据:
> test
+ CLIENT ORDERS_DATE
+ 1 2014-09-22
+ 1 2014-12-16
+ 2 2014-10-08
+ 2 2014-10-12
+ 2 2014-10-26
+ 2 2014-11-06
sqldf 代码:
> avg.time.orders.before = sqldf("SELECT CLIENT , AVG(ORDERS_DATE - lag_orderdate) AS avg_time_between_orders
FROM (
SELECT CLIENT , ORDERS_DATE , LAG(ORDERS_DATE) OVER (PARTITION by CLIENT ORDER BY ORDERS_DATE) AS lag_orderdate
FROM test
)
GROUP BY CLIENT")
我收到以下错误消息:“sqliteSendQuery(con, statement, bind.data) 中出错:
语句错误:靠近“(”:语法错误
lag
、partition by
、over
等只能与 PostgreSQL 后端一起使用到 sqldf。假设您正在使用默认的 SQLite 后端,并假设我们想要按升序排序的订单的平均差异,我们可以这样做。
假设在时间 t1 <= t2 <= t3 <= t4 有 4 个订单。那么平均差就是
((t4-t3) + (t3-t2) + (t2-t1)) / (4 - 1)
= (t4 - t1) / (4 - 1)
其中 t1 是最早的订单,t4 是最新的。因此,一般来说,伸缩和减少到最后一个订单和第一个订单之间的差异,平均值是除以订单数减1。因此我们有:
sqldf("select CLIENT, (max(ORDERS_DATE) - min(ORDERS_DATE)) / (count(*) - 1) AVG_DIFF
from test
group by CLIENT")
给予:
CLIENT AVG_DIFF
1 1 85.000000
2 2 9.666667
我们可以通过检查它是否给出与以下相同的答案来仔细检查它 - 如果订单在 CLIENT 中排序,这将给出相同的答案,这似乎是问题中的情况:
aggregate(ORDERS_DATE ~ CLIENT, test, function(x) mean(diff(x)))
注意: 我们假设此输入:
test <-
structure(list(CLIENT = c(1L, 1L, 2L, 2L, 2L, 2L), ORDERS_DATE =
structure(c(16335, 16420, 16351, 16355, 16369, 16380), class = "Date")),
.Names = c("CLIENT", "ORDERS_DATE"), row.names = c(NA, -6L), class = "data.frame")
我想获取按客户分组的订单之间的平均时间。我想用 sqldf 库 R.
测试数据:
> test
+ CLIENT ORDERS_DATE
+ 1 2014-09-22
+ 1 2014-12-16
+ 2 2014-10-08
+ 2 2014-10-12
+ 2 2014-10-26
+ 2 2014-11-06
sqldf 代码:
> avg.time.orders.before = sqldf("SELECT CLIENT , AVG(ORDERS_DATE - lag_orderdate) AS avg_time_between_orders
FROM (
SELECT CLIENT , ORDERS_DATE , LAG(ORDERS_DATE) OVER (PARTITION by CLIENT ORDER BY ORDERS_DATE) AS lag_orderdate
FROM test
)
GROUP BY CLIENT")
我收到以下错误消息:“sqliteSendQuery(con, statement, bind.data) 中出错: 语句错误:靠近“(”:语法错误
lag
、partition by
、over
等只能与 PostgreSQL 后端一起使用到 sqldf。假设您正在使用默认的 SQLite 后端,并假设我们想要按升序排序的订单的平均差异,我们可以这样做。
假设在时间 t1 <= t2 <= t3 <= t4 有 4 个订单。那么平均差就是
((t4-t3) + (t3-t2) + (t2-t1)) / (4 - 1)
= (t4 - t1) / (4 - 1)
其中 t1 是最早的订单,t4 是最新的。因此,一般来说,伸缩和减少到最后一个订单和第一个订单之间的差异,平均值是除以订单数减1。因此我们有:
sqldf("select CLIENT, (max(ORDERS_DATE) - min(ORDERS_DATE)) / (count(*) - 1) AVG_DIFF
from test
group by CLIENT")
给予:
CLIENT AVG_DIFF
1 1 85.000000
2 2 9.666667
我们可以通过检查它是否给出与以下相同的答案来仔细检查它 - 如果订单在 CLIENT 中排序,这将给出相同的答案,这似乎是问题中的情况:
aggregate(ORDERS_DATE ~ CLIENT, test, function(x) mean(diff(x)))
注意: 我们假设此输入:
test <-
structure(list(CLIENT = c(1L, 1L, 2L, 2L, 2L, 2L), ORDERS_DATE =
structure(c(16335, 16420, 16351, 16355, 16369, 16380), class = "Date")),
.Names = c("CLIENT", "ORDERS_DATE"), row.names = c(NA, -6L), class = "data.frame")