既然您提到raw
(并假设您的因子级别少于 256 个) -如果内存是您的瓶颈而 CPU 时间不是,您可以执行先决条件转换操作。例如:
f = factor(rep(1L, 1e5))
object.size(f)
# 400456 bytes
f.raw = as.raw(f)
object.size(f.raw)
#100040 bytes
# to go back:
identical(as.factor(as.integer(f.raw)), f)
#[1] TRUE
您也可以单独保存因子水平并恢复它们,如果这是您感兴趣的事情,但就分组和所有事情而言,您可以只使用它来完成所有操作,raw
并且永远不会回到因子(除了演示文稿)。
如果您有特定用例对此方法有疑问,请发布,否则我认为这应该可以正常工作。
这是您的课程的起点byte.factor
:
byte.factor = function(f) {
res = as.raw(f)
attr(res, "levels") <- levels(f)
attr(res, "class") <- "byte.factor"
res
}
as.factor.byte.factor = function(b) {
factor(attributes(b)$levels[as.integer(b)], attributes(b)$levels)
}
因此,您可以执行以下操作:
f = factor(c('a','b'), letters)
f
#[1] a b
#Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z
b = byte.factor(f)
b
#[1] 01 02
#attr(,"levels")
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
#[20] "t" "u" "v" "w" "x" "y" "z"
#attr(,"class")
#[1] "byte.factor"
as.factor.byte.factor(b)
#[1] a b
#Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z
如果您想制作通用并添加您想要添加的任何功能,请查看如何data.table
覆盖。一切都应该很简单。rbind.data.frame
as.factor