我有一些以以下方式格式化的数据:
time count
00:00 17
00:01 62
00:02 41
所以我从00:00到23:59,并且每分钟都有一个计数器。我想以15分钟为间隔对数据进行分组,以便:
time count
00:00-00:15 148
00:16-00:30 284
我已经尝试过手动执行此操作,但是这很累,因此我确定必须有一个函数或某项功能才能轻松执行此操作,但是我还没有弄清楚如何执行此操作。
我真的很感谢您的帮助!
非常感谢你!
对于POSIXct格式的数据,您可以使用此cut
功能创建15分钟的分组,然后按这些分组进行汇总。下面的代码显示了如何base R
在dplyr
和data.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))
基数R
cut
将数据分为15分钟:
dat$by15 = cut(dat$time, breaks="15 min")
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
现在,aggregate
通过新的分组列,将其sum
用作聚合函数:
dat.summary = aggregate(count ~ by15, FUN=sum, data=dat)
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
dplyr
library(dplyr)
dat.summary = dat %>% group_by(by15=cut(time, "15 min")) %>%
summarise(count=sum(count))
数据表
library(data.table)
dat.summary = setDT(dat)[ , list(count=sum(count)), by=cut(time, "15 min")]
更新:要回答评论,在这种情况下,每个分组间隔的终点是as.POSIXct(as.character(dat$by15)) + 60*15 - 1
。换句话说,分组间隔的终点是15分钟减去该间隔开始的一秒。我们添加60 * POSIXct
15-1,因为以秒为单位。这as.POSIXct(as.character(...))
是因为cut
返回一个因子,这会将其转换回日期时间,以便我们可以对其进行数学运算。
如果希望终点到下一个间隔之前的最近分钟(而不是最近的秒),则可以选择as.POSIXct(as.character(dat$by15)) + 60*14
。
例如,如果您不知道间隔时间,因为您选择了间隔时间并让R选择间隔,则可以通过执行操作找到要添加的秒数max(unique(diff(as.POSIXct(as.character(dat$by15))))) - 1
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句