2012-08-22 7 views
20

Ho una matriceordinare una matrice per colonna multipla in 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 

e desidero ordinare la matrice in ordine decrescente, prima di colonna 1 e poi da colonna due conseguente matrice

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 

Qualche suggerimento su come potrei ottenere questo? Grazie.

risposta

24

La funzione order dovrebbe farlo.

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

sarebbe bello avere una soluzione, in cui il numero di colonne voglio ordinare per può variare. – jmb

+1

@ jmb: dovresti fare la tua domanda, con un esempio di come questa soluzione non è sufficiente per le tue esigenze. Posso pensare a un attacco rapido, ma altri possono probabilmente trovare qualcosa di meglio: 'df [do.call (order, c (decreasing = TRUE, data.frame (df [, 1: 2]))), ] ' –

4

order funzione ti aiuterà, provate questo:

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 

Il meno davanti df indica che l'ordine è in diminuzione. Otterrai lo stesso risultato impostato decreasing=TRUE.

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

Per completare la risposta principale, ecco un modo per farlo a livello di codice, senza dover specificare le colonne a 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 

Come semplice esempio, diciamo che voglio usare tutto le colonne nel loro ordine di apparizione per ordinare le righe della matrice: (si potrebbe facilmente dare un vettore di indici alla matrice)

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