Funktionelle Möglichkeit, eine Liste von 2D-Matrizen in eine 3D-Matrix zu stapeln

8

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).

    
Ari B. Friedman 14.05.2013, 00:39
quelle

4 Antworten

6

Sie können das Paket abind verwenden und dann do.call(abind, c(test, along = 3))

verwenden %Vor%

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

geändert wird

zB

%Vor%     
mnel 14.05.2013, 00:47
quelle
10

Versuchen Sie Folgendes:

%Vor%     
G. Grothendieck 14.05.2013 12:31
quelle
2

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.

%Vor%

Wenn Sie die Dimensionen nicht fest codieren möchten, müssen wir einige Annahmen treffen, können aber die Dimension von test , z. B.

, leicht ausfüllen %Vor%

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.

    
Gavin Simpson 14.05.2013 02:12
quelle
2
%Vor%

oder wenn Sie die voraussichtliche Größe nicht im Voraus wissen:

%Vor%     
Ricardo Saporta 14.05.2013 00:55
quelle

Tags und Links