2013-11-14 48 views
7

我想更好地理解利用keyd data.table s。閱讀完文檔後,我想我知道如何在使用一個密鑰時加快子集化。例如:如何定義data.table鍵以使用多鍵快速聚合

DT = data.table(x=rep(c("ad","bd","cd"),each=3), y=c(1,3,6), v=1:9) 

選項之一:

DT[x == "ad"] 

選項二:

setkey(DT,x) 
DT["ad"] 

在這種情況下,方案一比方案二慢得多,因爲data.table使用密鑰以更有效地進行搜索(使用二進制搜索與矢量掃描相比,我不明白但我相信會更快。)

在使用by語句對數據的子集合進行聚合的情況下,定義密鑰的最快方法是什麼?我是否應該將我正在使用的列鍵入數據子集或定義組的列?例如:

setkey(DT,x) 
DT[!"bd",sum(v),by=y] 

setkey(DT,y) 
DT[!"bd",sum(v),by=y] 

是否有利用兩個xy密鑰的方法嗎?

編輯

是否設置關鍵要雙方xy執行兩個向量搜索?即:

setkey(DT,x,y) 

EDIT2

對不起,我的意思問是將呼叫DT[!"bd",sum(v),by=y]執行兩個二進制掃描時,DT是由X和Y兩個鍵?

+1

也許你正在尋找這樣的:http://stackoverflow.com/a/15597713/817778 - 一個謹慎注意 - 選擇一個比選項2更快*即,如果你所做的只是一次查找,並且還沒有按鍵設置,簡單的矢量掃描將會更快 – eddi

+0

@eddi因此,矢量掃描比設置密鑰然後進行搜索?換句話說,我不應該在每次搜索新列之前設置一個新密鑰?我看到了你引用的答案,但我很好奇爲i參數使用了一個鍵,並且按照賦值使用了另一個鍵。 – dayne

+0

回答你的編輯--' setkey'對所有列進行排序(最後到第一個),所以將在*最少*執行'nrows * num_keycols'操作 – eddi

回答

1

我相信當數據表DT由x和y鍵入時,不可能執行兩個二進制掃描。相反,我會第一個重複x上的鍵,然後在ÿ如下:

DT = data.table(x=rep(c("ad","bd","cd"),each=3), y=as.character(c(1,3,4)), v=1:9) 
setkey(DT,x) 
tmp = DT[!"bd"] 
setkey(tmp,y) 
tmp[!"1",sum(v),by=y]