在 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