首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在data.table中设置密钥的目的是什么?

在data.table中设置密钥的目的是什么?
EN

Stack Overflow用户
提问于 2013-11-18 02:56:49
回答 2查看 47.3K关注 0票数 118

我正在使用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分钟的快速启动指南也有一个关于键的指南。

  1. 关键字

让我们首先考虑data.frame,专有名词的行名(或英文中的行名)。也就是说,属于单个行的多个名称。属于单一行的多个名称?这不是我们在data.frame中所习惯的。我们知道每一行最多只有一个名称。一个人至少有两个名字,一个rst名字和一个第二个名字。这对于组织电话目录很有用,例如,电话簿按姓氏排序,然后再按rst名称排序。但是,data.frame中的每一行只能有一个名称。

键由一个或多个行名列组成,行名可以是整数、因子、字符或其他类,而不是简单的字符。此外,行按键排序。因此,data.table最多只能有一个键,因为它不能以一种以上的方式排序。

不强制执行唯一性,即允许重复的键值。由于行是按键排序的,所以键中的任何重复项都将连续出现。

电话簿有助于理解键是什么,但似乎键与有一个因素列没有什么不同。此外,它没有解释为什么需要键(特别是使用某些函数),以及如何选择要设置为键的列。而且,在以时间为列的data.table中,将任何其他列设置为键可能也会导致时间列的混乱,因为我不知道是否允许将任何其他列设置为键。有人能指点我吗?

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20039335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档