2012-12-04 13 views
7

私は年(10レベル)とメンバーID(200000レベル)の2つのキーを持つdata.tableを持っています。私が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 

。これはおそらくあなたが最も頻繁にサブセット化する可能性の高いものに依存します。

たとえば、あなたがyear, idとしてキーを設定している場合は、キーがid, yearとしたならば、あなたは

D[J(1)] 

しかしを使用することができます年1

のすべてのデータを取得する必要があるかもしれませんあなたはより多くのタイピングであり、それはunique(id)を計算する必要があるため、時間がかかりますどの

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

が必要になります。

二次キーを許可する機能リクエストFR#1007がありますが、まだ実装されていません。現在、複数の列を占めることができる単一のキーがあります。

+0

ありがとう、mnel。 – AdamNYC

関連する問題