我刚注意到包中有一个小怪癖。请参阅下面的代码段以重现。
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 databases
和tables
中的预期行为。即使数据内容发生变化,密钥也不会丢失。
有什么想法吗?
答案 0 :(得分:4)
我认为需要更改键值有点奇怪。通常希望在使用fread
或使用RODBC从数据库加载的数据旁边添加和更新新列,但是很少想要更改键列中的值,不是吗?关键列通常是数据集的基础,不会更改。
data.table
对此的处理方法默认情况下是最快的。它按照您的要求更改键列中的值,然后丢弃键,因为它不确定键是否仍然有效。如果确实希望它重建密钥,这可能会导致整个表重新排序,那么只需再次显式调用setkey
。这样,代码中的额外setkey
将使读者明白您的代码,对该关键列的更新可能会很昂贵。
data.table
中的键只是排序顺序。它更类似于SQL中的聚簇索引,其中磁盘上的行实际上是按该顺序存储的。