在 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