我正在使用 data.table
,有很多函数需要我设置键(例如X[Y]
)。因此,我希望了解键的作用,以便正确设置数据表中的键。
我读过的一些资料中包括?setkey
。
setkey()
对一个data.table
进行排序并标记。排序后的列就是键。键可以是任意顺序的任意列。列总是按升序排序的。表是原位更改的。除了临时工作内存(至少一个列大小)之外,不进行任何副本复制。
我的理解是,键将“排序”data.table
,导致与order()
具有非常相似的效果。然而,它没有解释设置键的目的。
数据表FAQ 3.2和3.3解释了:
3.2 我在一个大表上没有键,但分组仍然非常快。为什么?
data.table使用基数排序。这比其他排序算法快得多。基数排序专门用于整数,参见
?base::sort.list(x,method="radix")
。这也是为什么setkey()
很快的原因。当没有设置键或者我们按不同于键的顺序进行分组时,我们称之为“adhoc by”。3.3 为什么按键列进行分组比临时分组快?
因为每个分组在RAM中都是连续的,从而最大限度地减少了页面获取,并且内存可以批量复制(C中的
memcpy
)而不是循环处理。
从这里,我猜测设置键可以让R使用“基数排序”而非其他算法,这就是为什么它更快的原因。
10分钟的快速入门指南也有关于键的指南。
- 键
让我们从考虑data.frame开始,特别是行名(或英文中的row names)。也就是说,一个单独的行可以拥有多个名称。这不是我们在data.frame中习惯于看到的。我们知道每行最多只有一个名称。一个人至少有两个名字,一个名和一个姓。例如,按姓氏排序,然后按名字排序的电话簿就很有用。但是,在data.frame中,每一行只能有一个名字。
键由一列或多列行名组成,这些行名可以是整数、因子、字符或其他某些类别,而不仅仅是字符。此外,通过键对行进行排序。因此,一个data.table最多只能有一个键,因为它不能以多种方式排序。
唯一性未得到强制执行,即允许重复的键值。由于行按键排序,因此键中的任何重复值都将连续出现。
电话簿有助于理解什么是键,但与具有因子列相比,键似乎没有什么不同。此外,它并没有解释为什么需要键(尤其是要使用某些函数),以及如何选择要设置为键的列。此外,在具有时间列的data.table中,将任何其他列设置为键可能会破坏时间列,这使得它更加令人困惑,因为我不知道是否允许将其他列设置为键。请问有人可以帮助我理解吗?