在 data.table 中設定鍵
是的,你需要 SETKEY pre 1.9.6
在過去(1.9.6 之前版本)中,通過將列設定為表的鍵來加速 data.table
,特別是對於大型表。 [請參閱 2015 年 9 月版的第 5 頁介紹插圖 ,其中搜尋速度提高了 544 倍。]你可能會發現舊程式碼在設定表時使用此設定鍵和 setkey
或設定’key =‘列。
library(data.table)
DT <- data.table(
x = letters[1:5],
y = 5:1,
z = (1:5) > 3
)
#> DT
# x y z
#1: a 5 FALSE
#2: b 4 FALSE
#3: c 3 FALSE
#4: d 2 TRUE
#5: e 1 TRUE
使用 setkey
命令設定金鑰。你可以擁有包含多個列的鍵。
setkey(DT, y)
檢查表中的表格鍵()
tables()
> tables()
NAME NROW NCOL MB COLS KEY
[1,] DT 5 3 1 x,y,z y
Total: 1MB
請注意,這將重新排序你的資料。
#> DT
# x y z
#1: e 1 TRUE
#2: d 2 TRUE
#3: c 3 FALSE
#4: b 4 FALSE
#5: a 5 FALSE
現在沒必要了
在 v1.9.6 之前,你必須為某些操作設定金鑰,尤其是連線表。data.table 的開發人員已經加快並引入了一個 on=
功能,可以取代對金鑰的依賴。有關詳細討論, 請參見此處的答案。
2017 年 1 月,開發人員圍繞二級索引編寫了一個小插圖 ,解釋了 on
語法,並允許識別其他列以進行快速索引。
建立二級指數?
以類似於 key 的方式,你可以使用 setindex(DT, key.col)
或 setindexv(DT, "key.col.string")
,其中 DT 是你的 data.table。用 setindex(DT, NULL)
刪除所有索引。
使用 indices(DT)
檢視你的二級指數。
為何選擇二級指數
這不會對表進行排序 (與鍵不同),但允許使用 on
語法進行快速索引。請注意,只能有一個鍵,但你可以使用多個輔助索引,這樣可以節省重新鍵並使用表。這將在更改要分組的列時加快子集化。
回想一下,在上面的例子中,y 是表 DT 的關鍵:
DT
# x y z
# 1: e 1 TRUE
# 2: d 2 TRUE
# 3: c 3 FALSE
# 4: b 4 FALSE
# 5: a 5 FALSE
# Let us set x as index
setindex(DT, x)
# Use indices to see what has been set
indices(DT)
# [1] "x"
# fast subset using index and not keyed column
DT["c", on ="x"]
#x y z
#1: c 3 FALSE
# old way would have been rekeying DT from y to x, doing subset and
# perhaps keying back to y (now we save two sorts)
# This is a toy example above but would have been more valuable with big data sets