我想获得客户分组订单之间的平均时间。我想用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)出错: 声明中的错误:接近"(&#34 ;:语法错误"
答案 0 :(得分:2)
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")