为什么在更新密钥列时密钥会丢失?

时间:2014-01-17 04:01:26

标签: r data.table

我刚注意到包中有一个小怪癖。请参阅下面的代码段以重现。


DT = data.table(a=1:3, b=1:6);
setkey(DT,b);

# As expected - data is "keyed" on b
> key(DT) 
[1] "b"

# Now if i change content of column b, the key on the table "drops out"
DT [,b := seq(1,6)];

> key(DT)
NULL

仅供参考R version 3.0.1 (2013-05-16)Platform (x86_64-w64-mingw32)data.table version 1.8.11

在我看来,无论何时更新密钥列,data.table代码都会完全关闭密钥,因为数据的内容(以及它的顺序)会发生变化。我原本期望代码存储密钥,更改列b的内容,重新排序列b并恢复列b作为密钥。简而言之,保持密钥不变。

这类似于RDBMS databasestables中的预期行为。即使数据内容发生变化,密钥也不会丢失。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

我认为需要更改键值有点奇怪。通常希望在使用fread或使用RODBC从数据库加载的数据旁边添加和更新新列,但是很少想要更改键列中的值,不是吗?关键列通常是数据集的基础,不会更改。

data.table对此的处理方法默认情况下是最快的。它按照您的要求更改键列中的值,然后丢弃键,因为它不确定键是否仍然有效。如果确实希望它重建密钥,这可能会导致整个表重新排序,那么只需再次显式调用setkey。这样,代码中的额外setkey将使读者明白您的代码,对该关键列的更新可能会很昂贵。

data.table中的键只是排序顺序。它更类似于SQL中的聚簇索引,其中磁盘上的行实际上是按该顺序存储的。