我正在使用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()速度快的原因之一。当没有设置键,或者我们按与键的顺序不同的顺序分组时,我们称它为ad by。 3.3为什么按键中的列分组比按特定列分组的速度快? 因为每个组在RAM中是连续的,因此可以最小化页取,并且内存可以批量复制( C中为memcpy),而不是在C中循环。
从这里开始,我想设置一个键可以让R比其他算法使用“基排序”,这就是为什么它更快的原因。
10分钟的快速启动指南也有一个关于键的指南。
让我们首先考虑data.frame,专有名词的行名(或英文中的行名)。也就是说,属于单个行的多个名称。属于单一行的多个名称?这不是我们在data.frame中所习惯的。我们知道每一行最多只有一个名称。一个人至少有两个名字,一个rst名字和一个第二个名字。这对于组织电话目录很有用,例如,电话簿按姓氏排序,然后再按rst名称排序。但是,data.frame中的每一行只能有一个名称。
键由一个或多个行名列组成,行名可以是整数、因子、字符或其他类,而不是简单的字符。此外,行按键排序。因此,data.table最多只能有一个键,因为它不能以一种以上的方式排序。
不强制执行唯一性,即允许重复的键值。由于行是按键排序的,所以键中的任何重复项都将连续出现。
电话簿有助于理解键是什么,但似乎键与有一个因素列没有什么不同。此外,它没有解释为什么需要键(特别是使用某些函数),以及如何选择要设置为键的列。而且,在以时间为列的data.table中,将任何其他列设置为键可能也会导致时间列的混乱,因为我不知道是否允许将任何其他列设置为键。有人能指点我吗?
https://stackoverflow.com/questions/20039335
复制相似问题