在键控data.table中,在某个`where`处将键变量的值设置为将键设置为“NULL”

时间:2013-01-16 18:54:31

标签: r data.table

我想问一下,当我在某个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版。顺便说一句。

1 个答案:

答案 0 :(得分: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"