有没有一种方法来有效地计算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
方案将有什么可以帮助使上述速度更快。非常感谢!
答
查看?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
应为您提供data
(xid
)中每行的重叠行索引ref
(yid
)。并且重叠在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..
您需要考虑滚动连接.... – mnel 2014-10-01 06:15:53
Arun,感谢您的回复!是的,数据是我的错,让事件1>事件2发生错误。我遇到的问题是(我可能是错的),我似乎无法找到一种方法来搜索'event1'和'event2'之间夹有多少'event'基于'user' id 。看来,我无法弄清楚如何以及如果我只能通过用户ID找到重叠连接。我会正确还是错误?谢谢! – user1398057 2014-10-01 19:17:58