来自data.table手册:
事实上,我们非常喜欢它,data.table包含使用R的内部全局字符串缓存的字符向量的计数排序算法.对于包含许多重复项的字符向量(例如,键列中的分组数据),这尤其快.这意味着角色通常更倾向于因素.仍然完全支持因素,特别是有序因子(其中水平不按字母顺序排列).
是不是factor应该更容易做到这整数counting sort比character?
因素只是整数,它应该比字符更容易计数排序吗?
是的,如果你已经给了一个因素.但是,创造这个因素的时间可能很重要,而这正是setkey(以及临时by)的目标.尝试factor()对随机排序的字符向量进行计时,例如1e6长,1e4级别.然后与原始随机排序的字符向量进行比较setkey或临时by.
agstudy的评论也是正确的; 即,字符向量(指向R缓存字符串的指针)与因素非常相似.在32位系统上,字符向量与因子的整数向量大小相同,但该因子具有存储(有时也可以复制)的levels属性.在64位系统上,指针是两倍大.但另一方面,R的字符串缓存可以直接从字符向量指针中查找,而该因子通过级别有一个额外的跃点.(levels属性也是R字符串缓存指针的字符向量.)