从R中的每分钟数据创建15分钟的时间间隔?

adr*_*121 11 format time r

我有一些数据按以下方式格式化:

time     count 
00:00    17
00:01    62
00:02    41
Run Code Online (Sandbox Code Playgroud)

所以我从00:00到23:59,每分钟都有一个柜台.我想以15分钟的间隔对数据进行分组,以便:

time           count
00:00-00:15    148   
00:16-00:30    284
Run Code Online (Sandbox Code Playgroud)

我已经尝试手动完成但是这很累,所以我确信必须有一个功能或某事可以轻松完成,但我还没想出怎么做.

我真的很感激一些帮助!!

非常感谢你!

eip*_*i10 16

对于POSIXct格式的数据,您可以使用该cut函数创建15分钟分组,然后按这些组进行汇总.下面的代码显示了如何base Rdplyrdata.table包中使用和执行此操作.

首先,创建一些假数据:

set.seed(4984)
dat = data.frame(time=seq(as.POSIXct("2016-05-01"), as.POSIXct("2016-05-01") + 60*99, by=60),
                 count=sample(1:50, 100, replace=TRUE))
Run Code Online (Sandbox Code Playgroud)

基地R.

cut 数据分为15分钟组:

dat$by15 = cut(dat$time, breaks="15 min")
Run Code Online (Sandbox Code Playgroud)
                   time count                by15
1   2016-05-01 00:00:00    22 2016-05-01 00:00:00
2   2016-05-01 00:01:00    11 2016-05-01 00:00:00
3   2016-05-01 00:02:00    31 2016-05-01 00:00:00
...
98  2016-05-01 01:37:00    20 2016-05-01 01:30:00
99  2016-05-01 01:38:00    29 2016-05-01 01:30:00
100 2016-05-01 01:39:00    37 2016-05-01 01:30:00
Run Code Online (Sandbox Code Playgroud)

现在aggregate通过新的分组列,使用sum作为聚合函数:

dat.summary = aggregate(count ~ by15, FUN=sum, data=dat)
Run Code Online (Sandbox Code Playgroud)
                 by15 count
1 2016-05-01 00:00:00   312
2 2016-05-01 00:15:00   395
3 2016-05-01 00:30:00   341
4 2016-05-01 00:45:00   318
5 2016-05-01 01:00:00   349
6 2016-05-01 01:15:00   397
7 2016-05-01 01:30:00   341
Run Code Online (Sandbox Code Playgroud)

dplyr

library(dplyr)

dat.summary = dat %>% group_by(by15=cut(time, "15 min")) %>%
  summarise(count=sum(count))
Run Code Online (Sandbox Code Playgroud)

data.table

library(data.table)

dat.summary = setDT(dat)[ , list(count=sum(count)), by=cut(time, "15 min")]
Run Code Online (Sandbox Code Playgroud)

更新:要回答评论,对于这种情况,每个分组间隔的终点是as.POSIXct(as.character(dat$by15)) + 60*15 - 1.换句话说,分组间隔的端点是从间隔开始的15分钟减去1秒.我们添加60*15 - 1因为POSIXct以秒为单位命名.这as.POSIXct(as.character(...))是因为cut返回一个因子,这只是将它转换回日期时间,以便我们可以对它进行数学运算.

如果你希望终点到下一个间隔之前的最近分钟(而不是最近的间隔),你可以as.POSIXct(as.character(dat$by15)) + 60*14.

例如,如果您不知道中断间隔,因为您选择了中断数并让R选择间隔,您可以通过执行操作找到要添加的秒数max(unique(diff(as.POSIXct(as.character(dat$by15))))) - 1.