有没有办法使用data.table有效地计算A中的列值在B范围内?

时间:2014-10-01 05:32:07

标签: r data.table

我已经创建了一些代码来处理以下任务:

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软件包是否有任何可以帮助提高上述速度的方法。非常感谢你!

2 个答案:

答案 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应该为refyid)中的每一行提供dataxid)的重叠行索引。并且重叠是在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..