我已经创建了一些代码来处理以下任务:
ref = read.table(header=TRUE, text="
user event
1441 120120102
1441 120120888
1443 120122122
1445 120124452
1445 120123525
1446 120123463", stringsAsFactors=FALSE)
data = read.table(header=TRUE, text="
user event1 event2
1440 120123432 120156756
1441 120128523 120156545
1441 120123333 120146444
1441 120122344 120122355", stringsAsFactors=FALSE)
我在这里有一个函数(归功于用户Carlos Cinelli),它允许我在表data
上逐行进行搜索并记录在event1和event2之间夹有多少ref的事件,按user
id。
现在,我想知道是否有更快的方法来执行以下功能:
count <- function(x,y,z) ref[, sum(event >=x & event <= y & user ==z)]
data[, count:=mapply(x=event1, y=event2, z=user, count)]
我无法做太多事情,并且想知道data.table
软件包是否有任何可以帮助提高上述速度的方法。非常感谢你!
答案 0 :(得分:1)
查看?foverlaps
中的示例。它们清楚地显示了如何基于其他标识符中的重叠间隔加入。
require(data.table) ## 1.9.3+
setDT(ref)
setDT(data)
setkey(ref[, event2 := event])
ans = foverlaps(data, ref, by.x=c("user", "event1", "event2"), which=TRUE, nomatch=0L)
您的示例特别糟糕,因为没有重叠。所以我无法真正展示接下来的几个步骤。但是ans
应该为ref
(yid
)中的每一行提供data
(xid
)的重叠行索引。并且重叠是在user
中获得的 - 因为它也被设置为关键列。
我希望你能从这里开始......如果你发现这个问题无法解决,请发一个我可以运行的例子来重现你遇到的同样问题。
HTH
答案 1 :(得分:0)
最近实施了非等联接,并在current development version of data.table, v1.9.7中提供。这可以使用此功能以非常简单的方式执行:
require(data.table) # v1.9.7+
setDT(ref); setDT(data)
data[ref, .N, by=.EACHI, nomatch=0L, on=.(user, event1 <= event, event2 >= event)]
# returns an empty data.table here since no overlaps are found..