我只是注意到包装中有一个小怪癖。请参阅下面的代码片段进行重现。

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 代码会完全删除键,因为数据的内容(及其顺序)发生了变化。我本来希望代码存储 key 、更改 b 列的内容、重新排序 b 列并将 b 列恢复为 key 。简而言之,保持 key 不变。

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

有什么想法吗?

最佳答案

我认为需要更改键值有点奇怪。想要在使用 fread 或使用 RODBC 从数据库加载的数据旁边添加和更新新列是很常见的,但很少想更改键列中的值,不是吗?键列通常是数据集的基础,不会改变。
data.table 的方法是默认情况下它做最快的事情。它会按照您的要求更改键列中的值,然后删除该键,因为它不确定该键是否仍然有效。如果您真的希望它重建 key ,这可能会导致整个表的重新排序,那么只需再次显式调用 setkey 即可。这样,代码中额外的 setkey 将使代码的读者清楚地知道,对该键列的更新可能很昂贵。
data.table 中的键只是排序顺序。它更类似于 SQL 中的聚集索引,其中磁盘上的行实际上是按该顺序存储的。

关于r - 为什么在更新键列时会删除键?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21177626/

10-12 17:30