読者です 読者をやめる 読者になる 読者になる

dplyrで分とか時でgroup_by()したいときはlubridate::floor_date()

R dplyr

たとえばこういうデータがあって、分間に何レコードあるか数えたいとします。

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とか時系列に特化した形式のときは、もうちょっと楽な方法がありそうな予感がします。調べてないけど...