从会话到分钟摘要

时间:2017-05-30 16:42:53

标签: r dplyr

我有一个数据集,其中包含开始和结束时间戳的查看会话,我想创建一个逐分钟的摘要,显示每分钟的人数。 我的数据的简化版本如下所示:

db<-data.frame(id=1:4, start=c(1,1,2,4), end=c(3,4,5,6))

我想要这样的事情:

min1to2 = 2,
min2to3 = 3,
min3to4 = 2,
min4to5 = 2,
min5to6 = 1

实际上我的数据集非常大(大约6Gb),粒度级别是第二个,所以时间戳看起来像这样:"2017-04-01 09:01:26"。理想情况下我想使用dplyr。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

基于我的评论 - 包的可能解决方案:

# create the data as in the question
library(data.table)
db <- data.table(id=1:4, start=c(1,1,2,4), end=c(3,4,5,6))

# convert the 'start' & 'end' columns into real minute data
set.seed(1)
db[, (2:3) := lapply(.SD, function(x) as.POSIXct(paste0('2017-05-31 15:',x,':',sample(15:45,4)), format = '%Y-%m-%d %H:%M:%S') ), .SDcols = 2:3]

这导致以下data.table:

   id               start                 end
1:  1 2017-05-31 15:01:23 2017-05-31 15:03:21
2:  2 2017-05-31 15:01:26 2017-05-31 15:04:41
3:  3 2017-05-31 15:02:31 2017-05-31 15:05:42
4:  4 2017-05-31 15:04:40 2017-05-31 15:06:33

现在,以下代码:

db[, .(times = seq(as.POSIXct(floor(as.numeric(start)/60)*60, origin = '1970-01-01'),
                   as.POSIXct(floor(as.numeric(end)/60)*60, origin = '1970-01-01'), 'min')), id
   ][, .N, times][]

给出:

                 times N
1: 2017-05-31 15:01:00 2
2: 2017-05-31 15:02:00 3
3: 2017-05-31 15:03:00 3
4: 2017-05-31 15:04:00 3
5: 2017-05-31 15:05:00 2
6: 2017-05-31 15:06:00 1