2012-08-22 21 views
20

I tiene una matrizSolicitar una matriz por múltiples columna en r

df<-matrix(data=c(3,7,5,0,1,0,0,0,0,8,0,9), ncol=2) 
rownames(df)<-c("a","b","c","d","e","f") 

[,1] [,2] 
a 3 0 
b 7 0 
c 5 0 
d 0 8 
e 1 0 
f 0 9 

y quisiera ordenar la matriz en orden descendente primero por la columna 1 y luego por la columna dos resultante en la matriz

df.ordered<-matrix(data=c(7,5,3,1,0,0,0,0,0,0,9,8),ncol=2) 
rownames(df.ordered)<-c("b","c","a","e","f","d") 

    [,1] [,2] 
b 7 0 
c 5 0 
a 3 0 
e 1 0 
f 0 9 
d 0 8 

¿Alguna sugerencia sobre cómo podría lograr esto? Gracias.

Respuesta

24

La función order debería hacerlo.

df[order(df[,1],df[,2],decreasing=TRUE),] 
+0

Sería bueno tener una solución, donde el número de columnas Quiero ordenar por puede variar. – jmb

+1

@jmb: debe hacer su propia pregunta, con un ejemplo de cómo esta solución no es suficiente para sus necesidades. Puedo pensar en un hack rápido, pero otros probablemente pueden llegar a algo mejor que esto: 'df [do.call (orden, c (decreciente = TRUE, data.frame (df [, 1: 2]))), ] ' –

4

order función le ayudará a cabo, intente esto:

df[order(-df[,1],-df[,2]),] 
    [,1] [,2] 
b 7 0 
c 5 0 
a 3 0 
e 1 0 
f 0 9 
d 0 8 

El menos antes df indica que el orden está disminuyendo. Obtendrá la misma configuración de resultado decreasing=TRUE.

df[order(df[,1],df[,2],decreasing=TRUE),] 
13

Para completar la respuesta principal, aquí hay una manera de hacerlo mediante programación, sin tener que especificar las columnas con la mano:

set.seed(2013) # preparing my example 
mat <- matrix(sample.int(10,size = 30, replace = T), ncol = 3) 
mat 
     [,1] [,2] [,3] 
[1,] 5 1 6 
[2,] 10 3 1 
[3,] 8 8 1 
[4,] 8 9 9 
[5,] 3 7 3 
[6,] 8 8 5 
[7,] 10 10 2 
[8,] 8 10 7 
[9,] 10 1 9 
[10,] 9 4 5 

Como un simple ejemplo, vamos a decir que desea utilizar todas las columnas en su orden de aparición para ordenar las filas de la matriz: (Uno podría fácilmente dar un vector de índices de la matriz)

mat[do.call(order, as.data.frame(mat)),] #could be ..as.data.frame(mat[,index_vec]).. 
     [,1] [,2] [,3] 
[1,] 3 7 3 
[2,] 5 1 6 
[3,] 8 8 1 
[4,] 8 8 5 
[5,] 8 9 9 
[6,] 8 10 7 
[7,] 9 4 5 
[8,] 10 1 9 
[9,] 10 3 1 
[10,] 10 10 2 
Cuestiones relacionadas