2012-12-04 59 views
7

我有一個data.table有兩個鍵:Year(10級)和MemberID(200,000級)。當我setkey,setkey(MemberID, Year)導致與setkey(Year, MemberID)不同的性能?如果是這樣,哪種方式會更好?data.table中的鍵的順序是否重要?

回答

8

鍵設置的性能和速度取決於鍵變量類型。 numeric列將比integer慢。 character列(短字符串)看起來很快。

library(data.table) 

set.seed(1) 
DIC <- data.table(year = sample(seq_len(10), 5e6, TRUE), id = sample(as.character(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6)) 
DIC2 <- copy(DIC) 
DIF <- data.table(year = sample(seq_len(10), 5e6, TRUE), id = sample(as.factor(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6)) 
DIF2 <- copy(DIF) 
DNC <- data.table(year = sample(as.numeric(seq_len(10)), 5e6, TRUE), id = sample(as.character(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6)) 
DNC2 <- copy(DNC) 
DCC <- data.table(year = sample(as.character(seq_len(10)), 5e6, TRUE), id = sample(as.character(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6)) 
DCC2 <- copy(DCC) 
DII <- data.table(year = sample(seq_len(10), 5e6, TRUE), id = sample(seq_len(2e5), 5e6, TRUE), z = rnorm(5e6)) 
DII2 <- copy(DII) 

一些定時

# key of integer, character columns 
system.time(setkey(DIC, year ,id)) 
    user system elapsed 
    3.21 0.11 3.31 
system.time(setkey(DIC2, id, year)) 
    user system elapsed 
    3.43 0.03 3.45 
# key of integer factor columns 
system.time(setkey(DIF, year ,id)) 
    user system elapsed 
    6.31 0.05 6.37 
system.time(setkey(DIF2, id, year)) 
    user system elapsed 
    6.44 0.06 6.54 
# key of numeric, character columns 
system.time(setkey(DNC, year ,id)) 
    user system elapsed 
    9.91 0.07 10.29 
system.time(setkey(DNC2, id, year)) 
    user system elapsed 
    10.11 0.07 10.34 
# key of two character columns 
system.time(setkey(DCC, year ,id)) 
    user system elapsed 
    3.34 0.05 3.40 
system.time(setkey(DCC2, id, year)) 
    user system elapsed 
    3.40 0.02 3.42 
# key of two integer columns 
system.time(setkey(DII, year ,id)) 
    user system elapsed 
    6.25 0.02 6.53 
system.time(setkey(DII2, id,year)) 
    user system elapsed 
    6.44 0.05 6.64 

至於哪種方式會更好。這可能取決於你最可能經常單獨進行的子集。

例如,您可能需要獲得年1

所有數據如果您已設置的鍵year, id那麼你可以使用

D[J(1)] 

但如果鍵設置爲id, year那麼你就需要

D[J(unique(id),1), nomatch = 0] 

哪個更打字,因爲它具有計算unique(id)將需要更長的時間。

有一個功能請求FR#1007看起來允許一個輔助鍵,但這還沒有實現。目前有一個密鑰可以佔用多個列。

+0

非常感謝,mnel。 – AdamNYC

相關問題