4

我想问一下为什么当我在某个where子集更改键变量的值时,下面示例中的 data.table 会丢失其键。以及是否有必要。

library(data.table)
example(data.table)
setkey(DT,x)   # one key var only
DT[J("a"), x := "z"]
DT
   x y  v v2  m
1: z 1 13 84  5
2: z 3 13 84  5
3: z 6 13 84  5
4: c 1  7 NA  8
5: c 3  8 NA  8
6: c 6  9 NA  8
7: z 1 42 NA 42
8: z 3 42 NA 42
9: z 6 42 NA 42

这样就可以了。但是,我丢失了我的钥匙:

key(DT)
NULL

我猜想通过重新分配键x上方的键列会被删除。也许应该记住关键,即应该有一个隐含setkey(DT,x)的保留x作为关键?谢谢!

我使用的是 1.8.6 版。顺便一提。

4

1 回答 1

4

来自setkey的帮助文件:

'setkey()' 对'data.table' 进行排序并将其标记为已排序。[...] 列始终按升序排序。

当您替换任何键控列中的元素时,data.table不再排序(或至少不能保证是),因此未设置键以反映已更改的现实。

一个简单的解决方案是立即重置密钥:

## Creates the example data.table
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
setkey(DT, 'x')

## Immediately resets the (possibly multicolumn) key
setkeyv(DT["a", x:="z"], key(DT))

key(DT)   
# [1] "x"
于 2013-01-16T19:16:03.463 回答