2012-08-22 26 views
20

Ich habe eine MatrixSortieren eine Matrix durch mehrere Spalte 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 

und ich möchte, um die Matrix bestellen, um zuerst durch Säule 1 und dann durch Säule zwei resultierenden in der Matrix

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 
in absteigend

Irgendwelche Vorschläge, wie ich das erreichen könnte? Vielen Dank.

Antwort

24

Die order Funktion sollte es tun.

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

Wäre schön, eine Lösung zu haben, (Man könnte leicht einen Vektor von Indizes der Matrix geben), wo die Anzahl der Spalten ich möchte Sortieren nach kann variieren. – jmb

+1

@jmb: Sie sollten Ihre eigene Frage stellen, mit einem Beispiel, wie diese Lösung für Ihre Bedürfnisse nicht ausreicht. Ich kann mir einen schnellen Hack vorstellen, aber andere können sich wahrscheinlich etwas Besseres einfallen lassen: 'df [do.call (order, c (abnehmend = TRUE, data.frame (df [, 1: 2]))), ] ' –

4

order Funktion wird Ihnen helfen, versuchen Sie dies:

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 

Das Minus vor df zeigt an, dass die Reihenfolge abnimmt. Sie erhalten die gleiche Ergebniseinstellung decreasing=TRUE.

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

die Haupt Antwort abzuschließen, hier ist eine Möglichkeit, es programmatisch zu tun, ohne von Hand die Spalten angeben zu müssen:

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 

Als einfaches Beispiel nehmen wir sagen, dass ich alles verwenden möchten die Spalten in der Reihenfolge ihres Auftretens der Zeilen der Matrix zu sortieren:

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 
Verwandte Themen