在 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