【发布时间】:2013-12-01 02:30:16
【问题描述】:
我正在使用data.table,并且有许多功能需要我设置一个键(例如X[Y])。因此,我希望了解一个键的作用,以便在我的数据表中正确设置键。
我读到的一个来源是?setkey。
setkey()对data.table进行排序并将其标记为已排序。排序的列是关键。键可以是任何顺序的任何列。列始终按升序排序。该表通过引用进行更改。除了一列大小的临时工作内存之外,根本不进行任何复制。
我在这里的收获是,一个键会对 data.table 进行“排序”,从而产生与order() 非常相似的效果。但是,它并没有解释拥有密钥的目的。
data.table FAQ 3.2 和 3.3 解释:
3.2 我没有大桌子上的钥匙,但是分组还是很快的。这是为什么呢?
data.table 使用基数排序。这比其他的要快得多 排序算法。基数仅适用于整数,请参阅
?base::sort.list(x,method="radix")。这也是原因之一setkey()很快。当没有设置键,或者我们以不同的顺序分组时 从key的角度,我们称之为ad hoc by。3.3 为什么在 key 中按列分组比 ad hoc by 更快?
因为每个组在 RAM 中都是连续的,从而最小化页面 提取,并且可以批量复制内存(C中的
memcpy)而不是 在 C 中循环。
从这里,我猜想设置一个键以某种方式允许 R 使用“基数排序”而不是其他算法,这就是它更快的原因。
10 分钟快速入门指南也有按键指南。
- 钥匙
让我们首先考虑 data.frame,特别是行名(或在 英文,行名)。也就是说,属于一个单一的多个名称 排。属于单行的多个名称?那不是什么 我们习惯于在 data.frame 中。我们知道每一行最多有一个 姓名。一个人至少有两个名字,一个名字和一个名字。 这对于组织电话簿很有用,例如, 按姓氏排序,然后是名字。然而,每一行在一个 data.frame 只能有一个名称。
一个密钥由一个或多个组成 行名列,可以是整数、因子、字符或某些 其他类,不仅仅是性格。此外,行按以下方式排序 钥匙。因此,一个 data.table 最多可以有一个键,因为它 不能以多种方式排序。
不强制唯一性, 即,允许重复的键值。由于行是按 键,键中的任何重复项都会连续出现
电话簿有助于理解什么是键,但与具有因子列相比,键似乎没有什么不同。此外,它没有解释为什么需要键(尤其是使用某些功能)以及如何选择要设置为键的列。此外,似乎在以时间为列的 data.table 中,将任何其他列设置为键也可能会弄乱时间列,这使得它更加混乱,因为我不知道是否允许将任何其他列设置为钥匙。有人可以请教我吗?
【问题讨论】:
-
“我猜想以某种方式设置一个键允许 R 使用“基数排序”而不是其他算法”——我根本没有从帮助中得到。我的阅读是设置键按键排序。您可以按除键之外的其他列进行“临时”排序,而且速度很快,但不如您已经排序过的快。
-
我认为选择行时二进制搜索比矢量扫描更快。我不是计算机科学家,所以我不知道这实际上意味着什么。除了常见问题,请参阅the introduction。
标签: r data.table