あなたが言及したので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