提取R中巨大数据帧中每行的日期范围中的项目数

时间:2016-01-22 15:57:49

标签: r date vectorization

我想知道是否有人建议将高效功能应用于大数据框(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_timeend_time之间完成,作业在start_timeend_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)

有什么想法吗?

1 个答案:

答案 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_timeend_time的其他行使用start_time组中其他行的end_timehostnametype的其他可能值包括:withinstart&amp; end

此外,我使用.N-1来考虑“自我重叠”。