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]
是否有利用兩個x
和y
密鑰的方法嗎?
編輯
是否設置關鍵要雙方x
和y
執行兩個向量搜索?即:
setkey(DT,x,y)
EDIT2
對不起,我的意思向問是將呼叫DT[!"bd",sum(v),by=y]
執行兩個二進制掃描時,DT是由X和Y兩個鍵?
也許你正在尋找這樣的:http://stackoverflow.com/a/15597713/817778 - 一個謹慎注意 - 選擇一個比選項2更快*即,如果你所做的只是一次查找,並且還沒有按鍵設置,簡單的矢量掃描將會更快 – eddi
@eddi因此,矢量掃描比設置密鑰然後進行搜索?換句話說,我不應該在每次搜索新列之前設置一個新密鑰?我看到了你引用的答案,但我很好奇爲i參數使用了一個鍵,並且按照賦值使用了另一個鍵。 – dayne
回答你的編輯--' setkey'對所有列進行排序(最後到第一個),所以將在*最少*執行'nrows * num_keycols'操作 – eddi