巧妙的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