たとえばこういうデータがあって、分間に何レコードあるか数えたいとします。
library(dplyr) library(lubridate) set.seed(1) x <- runif(100, max = 60) d <- data.frame(timestamp = now() + seconds(cumsum(x))) head(d) #> timestamp #> 1 2015-09-22 07:18:16 #> 2 2015-09-22 07:18:38 #> 3 2015-09-22 07:19:13 #> 4 2015-09-22 07:20:07 #> 5 2015-09-22 07:20:19 #> 6 2015-09-22 07:21:13
lubridateのfloor_date()
(とかceiling_date()
)を使うとできます。こんな感じです。
参考:r - hourly sums with dplyr with zeros for empty hours - Stack Overflow
d %>% group_by(m = floor_date(timestamp, unit = "minute")) %>% summarise(count = n()) #> Source: local data frame [52 x 2] #> #> m count #> (time) (int) #> 1 2015-09-22 07:18:00 2 #> 2 2015-09-22 07:19:00 1 #> 3 2015-09-22 07:20:00 2 #> 4 2015-09-22 07:21:00 1 #> 5 2015-09-22 07:22:00 2 #> 6 2015-09-22 07:23:00 4 #> 7 2015-09-22 07:24:00 2 #> 8 2015-09-22 07:25:00 1 #> 9 2015-09-22 07:26:00 2 #> 10 2015-09-22 07:27:00 1 #> .. ... ...
n分ごと、にやるときはちょっとややこしいけどこんな感じです。
時間のfloorを取ったものに、分/3のfloorを自分で計算して足します。(ややこしいけど、minute()
は時刻から分だけ抜き出す関数、minutes()
は数値を「○分間」という時間に変換してくれる関数)
参考:r - Grouping every n minutes with dplyr - Stack Overflow
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-09-22 07:18:00 5 #> 2 2015-09-22 07:21:00 7 #> 3 2015-09-22 07:24:00 5 #> 4 2015-09-22 07:27:00 3 #> 5 2015-09-22 07:30:00 9 #> 6 2015-09-22 07:33:00 6 #> 7 2015-09-22 07:36:00 5 #> 8 2015-09-22 07:39:00 5 #> 9 2015-09-22 07:42:00 5 #> 10 2015-09-22 07:45:00 8 #> 11 2015-09-22 07:48:00 6 #> 12 2015-09-22 07:51:00 6 #> 13 2015-09-22 07:54:00 5 #> 14 2015-09-22 07:57:00 4 #> 15 2015-09-22 08:00:00 7 #> 16 2015-09-22 08:03:00 8 #> 17 2015-09-22 08:06:00 4 #> 18 2015-09-22 08:09:00 2
データがdata.frameじゃなくて、xtsとかzooとか時系列に特化した形式のときは、もうちょっと楽な方法がありそうな予感がします。調べてないけど...