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