为什么"数字通常是首选因素"在data.table中为key?

col*_*ang 7 r data.table

来自data.table手册:

事实上,我们非常喜欢它,data.table包含使用R的内部全局字符串缓存的字符向量的计数排序算法.对于包含许多重复项的字符向量(例如,键列中的分组数据),这尤其快.这意味着角色通常更倾向于因素.仍然完全支持因素,特别是有序因子(其中水平不按字母顺序排列).

是不是factor应该更容易做到这整数counting sortcharacter

Mat*_*wle 9

因素只是整数,它应该比字符更容易计数排序吗?

是的,如果你已经给了一个因素.但是,创造这个因素的时间可能很重要,而这正是setkey(以及临时by)的目标.尝试factor()对随机排序的字符向量进行计时,例如1e6长,1e4级别.然后与原始随机排序的字符向量进行比较setkey或临时by.

agstudy的评论也是正确的; 即,字符向量(指向R缓存字符串的指针)与因素非常相似.在32位系统上,字符向量与因子的整数向量大小相同,但该因子具有存储(有时也可以复制)的levels属性.在64位系统上,指针是两倍大.但另一方面,R的字符串缓存可以直接从字符向量指针中查找,而该因子通过级别有一个额外的跃点.(levels属性也是R字符串缓存指针的字符向量.)

  • 这个答案有点过时了——发生了什么变化,因为“data.table”并行地做了很多事情,_但这不能在字符列上完成_由于 R 本身的限制(事实上这个限制与到字符串的全局缓存)。因此,因子字符选择不再那么简单 - 如果您有一个低基数(`uniqueN(x)/length(x)`很小)字符串列,您正在计算(分组、子集、计算)a很多,可能值得切换到“factor”来利用并行性。 (2认同)