有没有一种方法来有效地计算A中的列值,使用data.table落在B的范围内?

问题描述:

我已经创造了一些代码来处理以下任务:有没有一种方法来有效地计算A中的列值,使用data.table落在B的范围内?

ref = read.table(header=TRUE, text=" 
user event 
1441 120120102 
1441 120120888 
1443 120122122 
1445 120124452 
1445 12
1446 12", stringsAsFactors=FALSE) 

data = read.table(header=TRUE, text=" 
user event1  event2 
1440 12
1441 120128523  120156545 
1441 12
1441 120122344  120122355", stringsAsFactors=FALSE) 

我在这里是一个函数(信用卡用户卡洛斯的Cinelli),让我通过线对表data走线和搜索记录事件1和事件2之间有多少参考事件,由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方案将有什么可以帮助使上述速度更快。非常感谢!

+1

您需要考虑滚动连接.... – mnel 2014-10-01 06:15:53

+0

Arun,感谢您的回复!是的,数据是我的错,让事件1>事件2发生错误。我遇到的问题是(我可能是错的),我似乎无法找到一种方法来搜索'event1'和'event2'之间夹有多少'event'基于'user' id 。看来,我无法弄清楚如何以及如果我只能通过用户ID找到重叠连接。我会正确还是错误?谢谢! – user1398057 2014-10-01 19:17:58

查看?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应为您提供dataxid)中每行的重叠行索引refyid)。并且重叠在user内获得- 因为它也被设置为关键列。

我希望你能从这里拿...如果你发现这个问题没有解决,请发表一个我可以运行的例子来重现你遇到的同样的问题。

HTH

+0

Arun,这非常有意义,谢谢,我明白了! – user1398057 2014-10-02 09:55:44

非等距联接在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..