我使用的是 data.table
,有很多函数需要我设置一个键(例如 X[Y]
)。因此,我希望了解键的作用,以便在我的数据表中正确设置键。
我读到的一个来源是 ?setkey
。
setkey()
对data.table
进行排序并将其标记为已排序。已排序的列是键。键可以是任何顺序的任何列。列总是按升序排序。该表通过引用更改。除了一列大小的临时工作内存外,根本不进行任何复制。
My takeaway here is that a key would "sort" the data.table, resulting in a very similar effect to order()
. However, it doesn't explain the purpose of having a key.
Table FAQ 3.2和3.3解释道:
3.2我没有大桌子上的密钥,但是分组还是很快的。为什么呢?
Table 使用基数排序 基数是专门用于整数的,请参见 这也是原因之一
setkey()
是快速的。当没有设置键时,或者我们按照不同的顺序分组 我们称之为 ad hoc by。3.3为什么按键中的列分组比临时分组快?
Because each group is contiguous in RAM, thereby minimising page 可以批量复制内存(C 中的
memcpy
) ,而不是 在 C 中循环。
从这里开始,我猜想设置一个键可以让 R 在其他算法之上使用“基数排序”,这就是为什么它更快的原因。
10分钟快速启动指南也有一个关于键的指南。
- 钥匙
让我们首先考虑 data.frame,特别是行名(或 in English, row names). That is, the multiple names belonging to a single 行的多个名称? 这不是什么 我们习惯于在一个 data.frame 中,我们知道每行最多只有一个 一个人至少有两个名字,第一个名字和第二个名字。 举例来说,举办一个电话簿是很有用的 按姓氏排序,然后按名字排序 Frame 只能有一个名称。
一个密钥由一个或多个组成 columns of rownames, which may be integer, factor, character or some 其他类,而不仅仅是字符。此外,行是按照 因此,data.table 最多只能有一个键,因为它 不能以多种方式进行排序。
独特性不是强制的, 例如,允许重复的键值 密钥,密钥中的任何重复都会连续出现
这个电话簿有助于理解什么是密钥,但似乎密钥与有一个因子列没有什么不同。此外,它没有解释为什么需要键(特别是为了使用某些函数)以及如何选择要设置为键的列。另外,在 data.table 中,把 time 作为一个列,把任何其他列设置为 key 可能也会把 time 列搞乱,这使得它更加令人困惑,因为我不知道是否允许把任何其他列设置为 key。有人能给我解释一下吗?