sqldf R - 订单之间的天数 - 按客户分组

时间:2016-11-08 16:19:11

标签: r date sqldf

我想获得客户分组​​订单之间的平均时间。我想用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 ;:语法错误"

1 个答案:

答案 0 :(得分:2)

lagpartition byover等只能与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")