计算新事件发生时当前丢失的事件数(RevoScaleR / mrsdeploy)

时间:2017-01-25 15:14:01

标签: r sql-server-2016

以下是一些示例数据:

Begin = c("10-10-2010 12:15:35", "10-10-2010 12:20:52", "10-10-2010 12:23:45", "10-10-2010 12:25:01", "10-10-2010 12:30:29")

End = c("10-10-2010 12:24:23", "10-10-2010 12:23:30", "10-10-2010 12:45:15", "10-10-2010 12:32:11", "10-10-2010 12:45:05")

df = data.frame(Begin, End)

我想计算新事件开始时当前未完成的事件数,并将其记录在新列中。因此,对于此特定示例,所需的最终结果将是具有值的列:0,1,1,1,2

我有一个如何使用data.table执行此操作的解决方案,它工作正常。我希望能够找到一个适用于RevoScaleR / mrsdeploy包的解决方案,这样做的程序可以利用并行计算/数据分块。

以下是适用于data.table的解决方案:

library(lubridate)
library(data.table)
df <- as.data.frame(lapply(df, dmy_hms))
dt <- as.data.table(df)
setkey(dt,Begin,End)[,id:=.I]
merge(dt, foverlaps(dt,dt)[id>i.id,.N,by="Begin,End"], all.x=T)[,id:=NULL][is.na(N),N:=0][]

同样,我正在寻找一个可以在SQLSERVER2016上远程执行的软件包。

3 个答案:

答案 0 :(得分:0)

流程以升序开始和结束,并记录您看到的开始和结束的数量。如果你没有重复/虚假的结束事件,这将正常工作。

答案 1 :(得分:0)

这似乎是通过一个简单的sapply

来实现的
sapply(df$Begin, function(x) sum((x < df$End) & (x > df$Begin))) 

要进行并行化,只需使用rxExecmclapplyparLapplyforeach等。

答案 2 :(得分:0)

我找到了一种在t-sql中执行此操作的方法,这是最快捷的方式。该信息位于此处:http://sqlmag.com/t-sql/intervals-and-counts-part-1

对于将来这样做的人来说,它也可以很容易地翻译成R.我选择只在t-sql中完成操作。