我想知道是否有人建议将高效功能应用于大数据框(2m行,50个变量)以提取位于行中指定的日期范围内的项目数。例如,我的数据框看起来像这样:
row.name start_time end_time jid hostname
1930525 2016-01-21 15:41:35 2016-01-21 15:47:40 1976235 hpc1node10
1930526 2016-01-21 15:40:50 2016-01-21 15:47:44 1976230 hpc1node08
1930527 2016-01-21 15:37:20 2016-01-21 15:47:46 1976192 hpc1node16
1930528 2016-01-21 15:43:05 2016-01-21 15:47:53 1976533 hpc1node13
1930529 2016-01-21 15:37:35 2016-01-21 15:47:54 1976197 hpc1node16
我想计算每一行(作业)有多少其他作业同时运行。因此,哪些作业在start_time
和end_time
之间完成,作业在start_time
和end_time
之间开始。
我尝试使用与by
一起使用的功能,但速度非常慢。但我想不出更好的方法。我的刺:
get_range <- function(r, d=NULL) {
# Attempt at reducing the number of items by only
# looking at 500 either side for the same hostname
dd = subset(d, jobnumber>r$jobnumber-500&jobnumber<r$jobnumber+500&hostname==r$hostname)
running_jobs = sum(
(dd$end_time>=r$start_time & dd$end_time <= r$end_time) |
(dd$start_time >= r$start_time & dd$start_time <= r$end_time)
)
running_jobs
}
然后运行
by(d, get_range, d=d)
有什么想法吗?
答案 0 :(得分:2)
您可以使用专门为大型数据集设计的 data.table 包中的foverlaps
函数有效地实现此目的:
library(data.table)
# converting to a 'data.table'
# and setting the keys to the time columns
# and adding an index column
setDT(d, key = c("hostname","start_time","end_time"))[, xid := .I]
# checking for overlaps & counting the number of overlaps
tmp <- foverlaps(d, d, which = TRUE)[, .N-1, xid]
# adding the count (N := V1) to 'd' by joining with 'tmp' on 'xid'
d[tmp, N := V1, on="xid"][, xid := NULL]
给出:
> d
row.name start_time end_time jid hostname N
1: 1930526 2016-01-21 15:40:50 2016-01-21 15:47:44 1976230 hpc1node08 0
2: 1930525 2016-01-21 15:41:35 2016-01-21 15:47:40 1976235 hpc1node10 0
3: 1930528 2016-01-21 15:43:05 2016-01-21 15:47:53 1976533 hpc1node13 0
4: 1930527 2016-01-21 15:37:20 2016-01-21 15:47:46 1976192 hpc1node16 1
5: 1930529 2016-01-21 15:37:35 2016-01-21 15:47:54 1976197 hpc1node16 1
在上面的解决方案中,我使用type = "any"
(这不是上面的代码,因为这是默认设置)来查找重叠start_time
和end_time
的其他行使用start_time
组中其他行的end_time
和hostname
。 type
的其他可能值包括:within
,start
&amp; end
。
此外,我使用.N-1
来考虑“自我重叠”。