Nach einem cleveren lapply
habe ich noch eine Liste von 2-dimensionalen Matrizen.
Zum Beispiel:
%Vor%Ich möchte das in ein dreidimensionales Array umwandeln:
%Vor% Wenn ich Replikat verwende, kann ich natürlich simplify
aktivieren, aber sapply
vereinfacht das Ergebnis nicht richtig, und stack
schlägt vollständig fehl. do.call(rbind,mylist)
verwandelt es in eine 2D-Matrix statt in ein 3D-Array.
Ich kann das mit einer Schleife machen, aber ich suche nach einer sauberen und funktionellen Methode, um damit umzugehen.
Der nächste Weg, den ich mir ausgedacht habe, ist:
%Vor%Aber ich habe das Gefühl, dass das unelegant ist (weil es die Array-Attribute der Vektoren zerlegt und dann wieder zusammenfügt und eine Menge Tests benötigt, um Sicherheit zu schaffen (z. B. dass die Dimensionen jedes Elements gleich sind).
Sie können das Paket abind
verwenden und dann do.call(abind, c(test, along = 3))
Oder Sie könnten simplify = 'array'
in einem Aufruf von sapply
(anstelle von lapply
) verwenden. simplify = 'array'
ist nicht identisch mit simplify = TRUE
, da das Argument higher
in simplify2array
zB
%Vor% Ein Array ist einfach ein atomarer Vektor mit Dimensionen. Jede der Matrixkomponenten von test
ist eigentlich nur ein Vektor mit Dimensionen. Daher ist die einfachste Lösung, die ich mir vorstellen kann, die Liste test
in einen Vektor zu entrollen und diese in ein Array umzuwandeln, indem array
und die passenden Dimensionen verwendet werden.
Wenn Sie die Dimensionen nicht fest codieren möchten, müssen wir einige Annahmen treffen, können aber die Dimension von test
, z. B.
Dies setzt voraus, dass die Dimensionen jeder Komponente gleich sind, aber dann sehe ich nicht, wie man Untermatrizen in ein 3-d Array setzen könnte, wenn diese Bedingung nicht erfüllt ist.
Dies mag hacky aussehen, um die Liste zu entrollen, aber dies nutzt einfach aus, wie R Matrizen und Arrays als Vektoren mit Dimensionen behandelt.
oder wenn Sie die voraussichtliche Größe nicht im Voraus wissen:
%Vor%Tags und Links r functional-programming