やりたいこと
データフレームのオブジェクトを matrix()
で生成されたようなただの行列に変換したい。単に as.matrix()
するだけじゃなくて、行や列の名前も無い行列にしたい。こんな風に。
変換前
# 適当に iris[1:10, 1:4] したやつ
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5.1 3.5 1.4 0.2
2 4.9 3.0 1.4 0.2
3 4.7 3.2 1.3 0.2
4 4.6 3.1 1.5 0.2
5 5.0 3.6 1.4 0.2
6 5.4 3.9 1.7 0.4
7 4.6 3.4 1.4 0.3
8 5.0 3.4 1.5 0.2
9 4.4 2.9 1.4 0.2
10 4.9 3.1 1.5 0.1
変換後
[,1] [,2] [,3] [,4]
[1,] 5.1 3.5 1.4 0.2
[2,] 4.9 3.0 1.4 0.2
[3,] 4.7 3.2 1.3 0.2
[4,] 4.6 3.1 1.5 0.2
[5,] 5.0 3.6 1.4 0.2
[6,] 5.4 3.9 1.7 0.4
[7,] 4.6 3.4 1.4 0.3
[8,] 5.0 3.4 1.5 0.2
[9,] 4.4 2.9 1.4 0.2
[10,] 4.9 3.1 1.5 0.1
以降、 hoge
は変換したい何らかのデータフレームオブジェクト。
hogeの例
hoge <- iris[1:10, 1:4]
その1からその3まで、それぞれ別々の方法を書いてみる。
その1 matrix()
を使う
まずは、素朴に matrix()
を用いる方法。 matrix()
の第一引数は勝手にベクトルにしてくれるので、 as.vector(as.matrix(hoge))
とかを渡さなくてもよい。
hoge <- matrix(as.matrix(hoge), nrow(hoge), ncol(hoge))
また、データフレームは転置すると行列型になる(記事の最後に参考URL)ので、以下のような書き方もできる。
hoge <- matrix(t(hoge), nrow(hoge), ncol(hoge), byrow = T)
その2 apply()
を使う
apply(hoge, 1, as.numeric)
1回のみの場合、列の名前が残って転置されたものが返ってくるので、もう一度転置している。
hoge <- apply(apply(hoge, 1, as.numeric), 1, as.numeric)
その3 名前を落とす
行と列、それぞれの名前を落とす例。
これでどちらか片方だけ名前を落とすこともできる。
hoge <- as.matrix(hoge)
colnames(hoge) <- NULL
rownames(hoge) <- NULL
あるいは、行と列一括で名前を落とす例。
hoge <- as.matrix(hoge)
dimnames(hoge) <- NULL
あるいは、一括で落とす例の別の書き方。
hoge <- as.matrix(hoge)
hoge <- unname(hoge)