После умного lapply
у меня остался список двумерных матриц.Функциональный способ перечислить список матриц 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)
превращает его в матрицу 2d, а не в 3d-массив.
Я могу сделать это с помощью петли, но я ищу аккуратный и функциональный способ справиться с этим.
Ближайший путь я придумал это:
array(do.call(c, test), dim=c(dim(test[[1]]),length(test)))
Но я чувствую, что это безвкусный (потому что он разбирает, а затем собирает атрибуты массива векторов, и требует много испытаний, чтобы сделать сейф (например, что размеры каждого элемента одинаковы).
есть еще abind пакет – baptiste
Я не согласен, что ваш «близкий путь» некрасиво и я также не согласен, что это нужно «много» тестирования. Это явно правильно, и вам нужно либо 'do.call (c, test)', либо 'unlist (test)', и после этого это совершенно просто. –
@ Dwin, может быть, я слишком сильно разбираюсь в своем коде. Но использование основ векторов/матриц всегда заставляет меня нервничать. Однако точка зрения, что это может быть не ужасное решение. –