2014-10-01 59 views
1

我已經創造了一些代碼來處理以下任務:有沒有一種方法來有效地計算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

回答

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應爲您提供dataxid)中每行的重疊行索引refyid)。並且重疊在user內獲得- 因爲它也被設置爲關鍵列。

我希望你能從這裏拿...如果你發現這個問題沒有解決,請發表一個我可以運行的例子來重現你遇到的同樣的問題。

HTH

+0

Arun,這非常有意義,謝謝,我明白了! – user1398057 2014-10-02 09:55:44

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.. 
相關問題