我正在使用data.table,并且有很多功能需要我设置一个键(例如X[Y]
)。因此,我希望了解键的作用,以便在数据表中正确设置键。
我读过的一个资料是 ?setkey
。
setkey()
排序一个data.table
并将其标记为已排序。排序的列是关键。键可以是任何顺序的任何列。列始终按升序排序。该表通过引用进行了更改。除了临时的工作存储区(最大为一列)外,根本不进行任何复制。
我在这里的要点是,一个键会“排序” data.table,从而产生与 order()
。但是,它没有解释拥有钥匙的目的。
data.table常见问题解答3.2和3.3说明:
3.2我没有大桌子上的钥匙,但是分组仍然非常快。这是为什么?
data.table使用基数排序。这比其他排序算法快得多。基数仅用于整数,请参见
?base::sort.list(x,method="radix")
。这也是为什么setkey()
快速的原因之一 。如果未设置任何键,或者我们按与键不同的顺序进行分组,则称其为临时。3.3为什么键中的按列分组比临时按分组更快?
由于每个组在RAM中是连续的,因此可以最大程度地减少页获取,并且可以批量复制内存(
memcpy
在C中),而不是在C中循环。
从这里开始,我猜想通过设置密钥可以使R在其他算法上使用“基数排序”,这就是为什么它更快的原因。
10分钟快速入门指南还提供了按键指南。
- 按键
让我们从考虑data.frame开始,特别是行名(或者用英语,行名)。即,多个名称属于单个行。属于单行的多个名称?那不是我们在data.frame中所习惯的。我们知道每一行最多只有一个名称。一个人至少有两个名字,第一个名字和第二个名字。例如,这对于组织电话目录很有用,该电话目录按姓氏,然后按姓氏排序。但是,data.frame中的每一行只能有一个名称。
键由一行或多列行名组成,这些行名可以是整数,因子,字符或其他某些类,而不仅仅是字符。此外,行按键排序。因此,一个data.table最多可以具有一个键,因为它不能以一种以上的方式进行排序。
不强制唯一性,即允许重复的键值。由于行是按键排序的,因此键中的所有重复项将连续出现
电话簿有助于理解键是什么,但与具有factor列相比,键似乎没有什么不同。此外,它没有解释为什么需要一个键(尤其是使用某些功能)以及如何选择要设置为键的列。另外,似乎在以时间为列的data.table中,将任何其他列设置为键也可能会使时间列混乱,这使我更加困惑,因为我不知道是否允许将其他任何列设置为键。有人可以启发我吗?