dplyrで分とか時でgroup_by()したいときにむりやりxtsを使ってみる
- dplyrで分とか時でgroup_by()したいときはlubridate::floor_date() - Technically, technophobic.
- 10分単位でgroup_byして集計したい - 盆栽日記
でやられている話を無理やり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