为何用键子集化data.table时,未预排序键值会导致键丢失?
问题解答:data.table子集化后键的保留规则
这是data.table的预期行为,且在官方文档中有相关说明。
核心原因
data.table的键(key)本质是标记表中某一列(或多列)的有序状态。当通过键值向量i进行子集化时:
- 如果
i中的键值完全遵循原表键的排序规则(比如你的states1是按state字母顺序排列,和原表键的排序一致),data.table会直接提取对应行,结果行的顺序和原表键的有序性保持一致,因此会保留原键; - 如果
i中的键值是乱序的(比如你的states2),data.table需要将提取的行重新排列成i的顺序,此时结果行的顺序已经打破了原键的有序性,所以会自动将键重置为NULL。
对应你的示例分析
states1 <- c('Iowa','Ohio','Utah'):键值按原表state列的字母顺序排列,子集后行顺序与原键有序性一致,因此key(dt.subset1)返回"state";states2 <- c('Utah','Iowa','Ohio'):键值乱序,子集后行顺序为Utah→Iowa→Ohio,不符合原键的有序性,因此key(dt.subset2)返回NULL;sort(states2):将键值重新恢复为有序状态,子集后行顺序回到原键的有序性,因此key(dt.subset2a)返回"state"。
文档依据
查看?data.table中关于i参数的说明:当i是键值向量时,若i已排序,data.table会触发快速子集优化,同时保留结果的键;若i未排序,结果会按i的顺序排列,且不会保留键。
内容的提问来源于stack exchange,提问作者Vasily A
相关产品推荐
相关产品推荐

