data.table - setkey(...)是否创建索引或对数据表中的行进行物理重新排序?

时间:2013-11-19 16:13:04

标签: r data.table

这个(非常基本的)问题是交换here的结果。

setkey()州的文档:

  

setkey()对data.table进行排序并将其标记为已排序。已排序的列   是关键。密钥可以是任何顺序的任何列。列是   总是以升序排序。表格已更改   参考 ...(强调添加)

我一直认为这意味着setkey()创建索引,而不是物理地重新排列数据表的行(类似于索引数据库表)。但如果这是真的,那么删除密钥(使用setkey(DT,NULL))应该删除索引并将数据表恢复为原始的未排序顺序。这不是发生的事情:

library(data.table)
DT <- data.table(a=3:1, b=1:3, c=5:7); DT
   a b c
1: 3 1 5
2: 2 2 6
3: 1 3 7
setkey(DT,a); DT
   a b c
1: 1 3 7
2: 2 2 6
3: 3 1 5
setkey(DT,NULL)
   a b c
1: 1 3 7
2: 2 2 6
3: 3 1 5

所以有两个问题:

1:如果重新排列(排序)行,那么“按引用更改”的含义是什么意思?

2:setkey(DT,NULL)到底做了什么?

1 个答案:

答案 0 :(得分:12)

  1. 对行进行排序。 &#34;通过引用更改&#34;这意味着没有复制整个表,只是交换了行。

  2. setkey(DT, NULL)相当于setattr(DT, "sorted", NULL)。它只是取消了排序&#34;排序&#34;属性。