行列は、要素と、行もしくは列をいれると作ることができる。
行もしくは列どちらかが指定されれば、Rが勝手に足りない方を計算してくれる。
matrix(1:15, nr=3, nc=5)
[,1] [,2] [,3] [,4] [,5] [1,] 1 4 7 10 13 [2,] 2 5 8 11 14 [3,] 3 6 9 12 15
要素は列から埋まっていくので、行から埋めたいときは
byrow=TRUE
を指定する。
matrix(1:15, nr=3, nc=5, byrow=TRUE)
[,1] [,2] [,3] [,4] [,5] [1,] 1 2 3 4 5 [2,] 6 7 8 9 10 [3,] 11 12 13 14 15
Rのベクトルは、長さが違うと勝手に補完するという機能がある。
Mat <- matrix(1:15, nr=3, nc=5) v <- c(1, 3, 7)
という行列とベクトルがあって、行列にベクトルを足そう、となると、
Mat + v
[,1] [,2] [,3] [,4] [,5] [1,] 2 5 8 11 14 [2,] 5 8 11 14 17 [3,] 10 13 16 19 22
と、列優先で演算する。
どうしても行優先で足したい、という場合は
t(Mat)
[,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9 [4,] 10 11 12 [5,] 13 14 15
と転置すれば、足してほしい行が列化することから、これにベクトルを足せばいい。
そして転置しなおせばいい。
t(t(Mat) + v)
[,1] [,2] [,3] [,4] [,5] [1,] 2 7 14 11 16 [2,] 9 6 11 18 15 [3,] 6 13 10 15 22
もしくは、
apply
を使って行に対して足すことを考えれば
v1 <- c(1, 3, 6, 8, 10) apply(Mat, 1, "+", v1)
[,1] [,2] [,3] [1,] 2 3 4 [2,] 7 8 9 [3,] 13 14 15 [4,] 18 19 20 [5,] 23 24 25
ってこれ、結果が列で返ってくるんだよな…
演算が列で先にやられるというのは、おそらくmatplotやboxplotが列でデータを取り扱っていること、そもそもデータってヘッダーにIDとか振るんじゃね、ということからだろう。