2012-10-12 7 views
5

Ich setze in R eine Zeile-Hauptdaten als Vektor. R interpretiert dies als Spaltenhauptdaten, und so weit ich sehen kann, gibt es keine Möglichkeit, dem Array zu sagen, dass es sich in einer Reihe-Haupt-Weise verhält.Zeilen-Haupt-zu-Spalte-Haupt-Dimensionen wechseln

Lassen Sie uns sagen, ich habe:

array(1:12, c(3,2,2), 
    dimnames=list(c("r1", "r2", "r3"), c("c1", "c2"),c("t1", "t2")) 
) 

Welche gibt:

, , t1 

    c1 c2 
r1 1 4 
r2 2 5 
r3 3 6 

, , t2 

    c1 c2 
r1 7 10 
r2 8 11 
r3 9 12 

Ich möchte diese Daten zu transformieren, um Zeilen-Haupt Array:

, , t1 
    c1 c2 
r1 1 2 
r2 3 4 
r3 5 6 

, , t2 

    c1 c2 
r1 7 8 
r2 9 10 
r3 11 12 

Antwort

6

Unter der Annahme, dass Ihr Array in a ist, das heißt, dass Sie bereits dieses Array und kann es überhaupt nicht Lesezeit ändern, dann werden folgende Arbeiten:

a <- array(1:12, c(3,2,2), 
      dimnames=list(c("r1", "r2", "r3"), c("c1", "c2"),c("t1", "t2"))) 

b <- aperm(array(a, dim = c(2,3,2), 
       dimnames = dimnames(a)[2:1]), 
      perm = c(2,1,3)) 
b 

>  b 
, , 1 

    c1 c2 
r1 1 2 
r2 3 4 
r3 5 6 

, , 2 

    c1 c2 
r1 7 8 
r2 9 10 
r3 11 12 
2

Die Lösung:

aperm(array(1:12, c(2,3,2), 
    dimnames=list(c("c1","c2"),c("r1","r2","r3"),c("t1","t2"))), 
    perm=c(2,1,3) 
) 

Beachten Sie, dass aperm die Abmessungen wechselt. Im Wesentlichen werden also Spalten mit Zeilen geschaltet. Außerdem musste ich die Reihenfolge der Spalten und Zeilen in Dimnamen ändern.

Es produziert genau das, was gebraucht wird:

, , t1 
    c1 c2 
r1 1 2 
r2 3 4 
r3 5 6 

, , t2 

    c1 c2 
r1 7 8 
r2 9 10 
r3 11 12 
+1

Ich bin verwirrt. Das Array, das Sie hier zeigen, ist * nicht * das, das Sie in Ihrer Frage haben. Ich habe verstanden, dass du ein Array der gezeigten Form hast, in welchem ​​Fall 'aperm()' allein dir nicht helfen wird. –

+0

Ich wollte die Daten (Vektor 1:12) in das gewünschte Array transformieren. Ich habe einige Zeit damit verbracht, dies herauszufinden und dachte, dass das hier helfen könnte. – Datageek

+1

Ah, OK. Als du "Lass uns sagen, ich habe" schrieb, nahm ich dich wörtlich. –