2012-10-12 8 views
5

Estoy poniendo en R una fila de datos principales como un vector. R interpreta esto como datos de columnas principales y, por lo que puedo ver, no hay manera de decirle a la matriz que se comporte de una manera importante.Conmutación de fila mayor a columna mayor dimensiones

Digamos que tengo:

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

Lo que da:

, , t1 

    c1 c2 
r1 1 4 
r2 2 5 
r3 3 6 

, , t2 

    c1 c2 
r1 7 10 
r2 8 11 
r3 9 12 

Quiero transformar estos datos a la fila-mayor variedad:

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

, , t2 

    c1 c2 
r1 7 8 
r2 9 10 
r3 11 12 

Respuesta

6

Suponiendo que la matriz está en a, es decir, que ya tiene esta matriz y no se puede cambiar en tiempo de lectura, entonces el siguiente trabajo:

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

La solución:

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

Tenga en cuenta que aperm cambia las dimensiones. Así que, esencialmente, las columnas se cambian con filas. Además, necesitaba cambiar el orden de las columnas y las filas en dimnames.

Se produce exactamente lo que se necesita:

, , 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

Estoy confundido. La matriz que muestra aquí es * no * la que tiene en su pregunta. Entendí que tenía una matriz del formulario mostrado, en cuyo caso 'aperm()' solo no lo ayudará. –

+0

Quería transformar los datos (vector 1:12) en la matriz deseada. He dedicado un tiempo a descifrar esto y pensé que poner esto aquí podría ayudar a alguien más. – Datageek

+1

Ah, está bien. Cuando escribiste "Digamos que tengo", te tomé literalmente. –

Cuestiones relacionadas