巧妙的lapply
之后,我剩下一列2维矩阵。将2D矩阵列表堆栈到3D矩阵的函数式方法
例如:
set.seed(1)
test <- replicate(5, matrix(runif(25),ncol=5), simplify=FALSE)
> test
[[1]]
[,1] [,2] [,3] [,4] [,5]
[1,] 0.8357088 0.29589546 0.9994045 0.2862853 0.6973738
[2,] 0.2377494 0.14704832 0.0348748 0.7377974 0.6414624
[3,] 0.3539861 0.70399206 0.3383913 0.8340543 0.6439229
[4,] 0.8568854 0.10380669 0.9150638 0.3142708 0.9778534
[5,] 0.8537634 0.03372777 0.6172353 0.4925665 0.4147353
[[2]]
[,1] [,2] [,3] [,4] [,5]
[1,] 0.1194048 0.9833502 0.9674695 0.6687715 0.1928159
[2,] 0.5260297 0.3883191 0.5150718 0.4189159 0.8967387
[3,] 0.2250734 0.2292448 0.1630703 0.3233450 0.3081196
[4,] 0.4864118 0.6232975 0.6219023 0.8352553 0.3633005
[5,] 0.3702148 0.1365402 0.9859542 0.1438170 0.7839465
[[3]]
...
我希望把它转换成一个3维数组:
set.seed(1)
replicate(5, matrix(runif(25),ncol=5))
显然,如果我使用复制我就可以打开simplify
,但sapply
没有正确简化结果,并且stack
完全失败。 do.call(rbind,mylist)
将其变成二维矩阵而不是三维阵列。
我可以用循环做到这一点,但我正在寻找一个简洁而实用的方式来处理它。
我想出最接近的方法是:
array(do.call(c, test), dim=c(dim(test[[1]]),length(test)))
但我认为这是个不雅的(因为它拆开,然后重新组装矢量的排列特性,并且需要大量的测试,使安全的(例如,每个元件的尺寸是相同的)。
还有的abind包 – baptiste 2013-05-14 00:46:43
我不同意,你最亲密的方式“是不雅的,我不同意进一步,它需要测试的“很多”。这显然是正确的,你确实需要'do.call(c,test)'或'unlist(test)',之后就完全简单了。 – 2013-05-14 01:13:17
@Dwin也许我对自己的代码太难了。但利用矢量/矩阵的基本原理总是让我感到紧张。但要指出的是,这可能不是一个可怕的解决方案。 – 2013-05-14 01:32:01