dplyrで分とか時でgroup_by()したいときにむりやりxtsを使ってみる

でやられている話を無理やりxts使ってやってみたらこうなるという話で、関数を用意してなんとかする感じです。しかも、xtsとlubridateの間の時間指定文字列が違うので、そこも変換せんといかんという。。。

library(xts)
library(dplyr)
library(lubridate)
#データの用意
set.seed(1)
x <- runif(100, max = 60)
d <- data.frame(timestamp = now() + seconds(cumsum(x)))
#関数の定義
group_time <- function(timestamp, unit, k)
{
  x <- xts(order.by=d$timestamp)
  ep <- endpoints(x, on=paste0(unit, "s"), k=k)
  floor_date(index(x)[unlist(mapply(rep, ep[-1], diff(ep)))], unit=unit)
}


使うとこんな感じ、時間の出方はちょっと違うけど、集計はあってる。

> d %>%
+   group_by(m = group_time(timestamp, unit="minute", k=3)) %>%
+   summarise(count = n())
Source: local data frame [18 x 2]

                     m count
                (time) (int)
1  2015-10-17 07:23:00     3
2  2015-10-17 07:26:00     4
3  2015-10-17 07:29:00     7
4  2015-10-17 07:32:00     4
5  2015-10-17 07:35:00     6
> d %>%
+   group_by(
+     m = floor_date(timestamp, unit = "hour") +
+       minutes(floor(minute(timestamp) / 3) * 3)
+   ) %>%
+   summarise(count = n())
Source: local data frame [18 x 2]

                     m count
                (time) (int)
1  2015-10-17 07:21:00     3
2  2015-10-17 07:24:00     4
3  2015-10-17 07:27:00     7
4  2015-10-17 07:30:00     4
5  2015-10-17 07:33:00     6