我有一个数据集,其中包含开始和结束时间戳的查看会话,我想创建一个逐分钟的摘要,显示每分钟的人数。 我的数据的简化版本如下所示:
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。
有什么想法吗?
答案 0 :(得分:2)
基于我的评论data.table - 包的可能解决方案:
# 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