以下是一些示例数据:
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上远程执行的软件包。
答案 0 :(得分:0)
流程以升序开始和结束,并记录您看到的开始和结束的数量。如果你没有重复/虚假的结束事件,这将正常工作。
答案 1 :(得分:0)
这似乎是通过一个简单的sapply
sapply(df$Begin, function(x) sum((x < df$End) & (x > df$Begin)))
要进行并行化,只需使用rxExec
,mclapply
,parLapply
,foreach
等。
答案 2 :(得分:0)
我找到了一种在t-sql中执行此操作的方法,这是最快捷的方式。该信息位于此处:http://sqlmag.com/t-sql/intervals-and-counts-part-1
对于将来这样做的人来说,它也可以很容易地翻译成R.我选择只在t-sql中完成操作。