r - 为什么在更新键列时删除键?

标签 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 版本 3.0.1 (2013-05-16)平台 (x86_64-w64-mingw32)data.table 版本 1.8 .11

在我看来,无论何时更新键列 - data.table 代码都会完全删除键,因为数据的内容(以及数据的顺序)发生了变化。我原以为代码会存储 key 、更改 b 列的内容、重新排序 b 列并将 b 列恢复为 key 。简而言之,保持 key 不变。

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

有什么想法吗?

最佳答案

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

data.table 对此的处理方式默认是最快的。它按照您的要求更改键列中的值,然后删除键,因为它不确定键是否仍然有效。如果您真的希望它重建 key ,这可能会导致整个表的重新排序,那么只需再次显式调用 setkey 即可。这样,代码中额外的 setkey 会让代码的读者清楚地知道,对该键列的更新可能代价高昂。

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

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

相关文章:

R dplyr 的 group_by 也考虑空组

r - 按分隔符拆分列并删除包含在其他值中的值

r - ggplot2:从变量应用自定义

r - ggplot2 多个几何图形的 z 顺序(背景到前景)

R-使用ddply对数据框中的列子集进行操作

r - data.table:当并非所有变量都在组内时,如何使用 %in% 过滤行?

R 中的滚动连接 data.table

r - 如何获取数据表子集的补码?

r - 如何在data.table中动态使用lapply?

r - 使用 data.table 更新按行相互依赖的两列