こんな感じで、リストの中に行と列の数が等しい行列があったとする。長さは簡単のため2にしている。
a <- mapply(function(z) matrix(z, 2), list(1:6, -(1:6)), SIMPLIFY=FALSE)
[[1]] [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 [[2]] [,1] [,2] [,3] [1,] -1 -3 -5 [2,] -2 -4 -6
これをいわゆるarray 形式にしたい。愚直にやるならこんな感じ。
array(unlist(a), c(2, 3, 2))
, , 1 [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 , , 2 [,1] [,2] [,3] [1,] -1 -3 -5 [2,] -2 -4 -6
abind というパッケージがあるのでこれを使うなら、along でどこにbind するか指定できるので
library(abind) abind(a[[1]], a[[2]], along=3)
, , 1 [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 , , 2 [,1] [,2] [,3] [1,] -1 -3 -5 [2,] -2 -4 -6
昔やったdo.call でやるなら、リスト構造をいじることなく直接書ける。
do.call(abind, c(a, along=3))
, , 1 [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 , , 2 [,1] [,2] [,3] [1,] -1 -3 -5 [2,] -2 -4 -6