2010-05-07 21 views
18
test1 <- as.matrix(c(1, 2, 3, 4, 5)) 
row.names(test1) <- c("a", "d", "c", "b", "e") 

test2 <- as.matrix(c(6, 7, 8, 9, 10)) 
row.names(test2) <- c("e", "d", "c", "b", "a") 

    test1 
    [,1] 
a 1 
d 2 
c 3 
b 4 
e 5 

test2 
    [,1] 
e 6 
d 7 
c 8 
b 9 
a 10 

¿Cómo puedo reordenar test2 para que las filas estén en el mismo orden que test1? por ejemplo:R: ¿Cómo puedo reordenar las filas de una matriz, data.frame o vector según otra

test2 
    [,1] 
a 10 
d 7 
c 8 
b 9 
e 6 

He intentado utilizar la función de reordenación con: de reordenación (test1, test2) pero no podría averiguar la sintaxis correcta. Veo que reordenar toma un vector, y estoy aquí usando una matriz. Mis datos reales tienen un vector de caracteres y otro como un data.frame. Pensé que la estructura de datos no importaría demasiado para este ejemplo anterior, solo necesito ayuda con la sintaxis y puedo adaptarla a mi problema real.

Respuesta

19
test2 <- test2[rownames(test1),,drop=FALSE] 
+0

¿por qué esto no funciona para mis datos? Quiero hacer test2 [match (test2 $ column, test1 $ column), 1, drop = FALSE] porque con lo que estoy haciendo coincidir es con los valores de las columnas, no con los row.names – chimpsarehungry

6

Después de fijar su código cortado con tijeras para generar realmente lo que su ejemplo muestra (pista: test1 tenían nombres a, b, c, d, e; te referías a, d, c, b, 1 ya que muestra ahora), esto era más fácil gracias a match():

R> test2[match(row.names(test2), row.names(test1)),1,drop=FALSE] 
    [,1] 
a 10 
d 7 
c 8 
b 9 
e 6 
R> 

la clave aquí es que match() hace lo que quiere:

R> match(row.names(test2), row.names(test1)) 
[1] 5 2 3 4 1 
+0

¿Por qué esto no funciona para mis datos? Quiero hacer 'test2 [match (test2 $ column, test1 $ column), 1, drop = FALSE]' porque con lo que estoy haciendo corresponder es con los valores de las columnas, no con los row.names – chimpsarehungry

Cuestiones relacionadas