Rで因子の行列を取得することは不可能のようです。それは本当ですか?はいの場合、なぜですか?そうでない場合は、どうすればよいですか?
f <- factor(sample(letters[1:5], 20, rep=TRUE), letters[1:5])
m <- matrix(f,4,5)
is.factor(m) # fail.
m <- factor(m,letters[1:5])
is.factor(m) # oh, yes?
is.matrix(m) # nope. fail.
dim(f) <- c(4,5) # aha?
is.factor(f) # yes..
is.matrix(f) # yes!
# but then I get a strange behavior
cbind(f,f) # is not a factor anymore
head(f,2) # doesn't give the first 2 rows but the first 2 elements of f
# should I worry about it?
残念ながら、ファクターのサポートはRで完全に普遍的ではないため、多くのR関数は、デフォルトでファクターを内部ストレージタイプ(integer
)として扱います。
> typeof(factor(letters[1:3]))
[1] "integer
これは、matrix
、cbind
で発生することです。彼らは因子を扱う方法を知りませんが、整数をどうするかを知っているので、あなたの因子を整数のように扱います。 head
は実際には反対です。因子の処理方法は知っていますが、因子が行列でもあることを確認する必要はないため、通常の無次元因子ベクトルのように扱います。
マトリックスに要素があるかのように操作するための最善の策は、マトリックスを特性に強制することです。操作が完了したら、ファクター形式に戻すことができます。整数形式でこれを行うこともできますが、奇妙なリスクがあります(たとえば、整数行列で行列の乗算を行うことはできますが、それは因子には意味がありません)。
クラス「行列」を因子に追加すると、いくつかの(すべてではない)ことが機能し始めることに注意してください。
f <- factor(letters[1:9])
dim(f) <- c(3, 3)
class(f) <- c("factor", "matrix")
head(f, 2)
生産:
[,1] [,2] [,3]
[1,] a d g
[2,] b e h
Levels: a b c d e f g h i
これはrbind
などを修正しません。