web-dev-qa-db-ja.com

Rで因子行列を取得できますか?

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?
18
iago-lito

残念ながら、ファクターのサポートはRで完全に普遍的ではないため、多くのR関数は、デフォルトでファクターを内部ストレージタイプ(integer)として扱います。

> typeof(factor(letters[1:3]))
[1] "integer  

これは、matrixcbindで発生することです。彼らは因子を扱う方法を知りませんが、整数をどうするかを知っているので、あなたの因子を整数のように扱います。 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などを修正しません。

7
BrodieG