2012-12-31 6 views
20

Wenn ein einzelnes Kriterium gut bestellt ist, gibt die Rangfunktion die offensichtliche Sache:Gibt es eine einfache Möglichkeit, nach mehreren Kriterien zu sortieren, die Bindungen in R erhalten?

rank(c(2,4,1,3,5)) 
[1] 2 4 1 3 5 

Wenn ein einzelnes Kriterium Bindungen hat, die Rangfunktion (Standardeinstellung) weist durchschnittlich Reihen die Bande:

rank(c(2,4,1,1,5)) 
[1] 3.0 4.0 1.5 1.5 5.0 

Mit der Rangfunktion können Sie nicht nach mehreren Kriterien sortieren, Sie müssen also etwas anderes verwenden. Eine Möglichkeit, dies zu tun, ist die Verwendung von Übereinstimmung und Reihenfolge. Für ein einzelnes Kriterium ohne Bindung sind die Ergebnisse die gleichen:

rank(c(2,4,1,3,5)) 
[1] 2 4 1 3 5 

match(1:5, order(c(2,4,1,3,5))) 
[1] 2 4 1 3 5 

für ein einziges Kriterium mit Riegeln, jedoch unterscheiden sich die Ergebnisse:

rank(c(2,4,1,4,5)) 
[1] 2.0 3.5 1.0 3.5 5.0 

match(1:5, order(c(2,4,1,4,5))) 
[1] 2 3 1 4 5 

Die Bindungen werden in einer solchen Art und Weise aufgebrochen, dass die gebundenen Elemente werden in ihrer ursprünglichen Reihenfolge beibehalten und nicht mit gleichen Rängen versehen. Diese Funktion verallgemeinert, natürlich, wenn Sie sortieren auf mehreren Kriterien:

match(1:5, order(c(2,4,1,4,5),c(10,11,12,11,13))) 
[1] 2 3 1 4 5 

Schließlich stellt sich die Frage: Gibt es eine einfache oder eingebaute, Art und Weise Rang unter Verwendung mehrerer Kriterien der Berechnung, die Beziehungen bewahrt? Ich habe eine Funktion zu tun geschrieben, aber es ist hässlich und scheint lächerlich kompliziert für eine solche grundlegende Funktionalität ...

+0

Was sollen die Ränge für das letzte Beispiel sein? –

+0

'2,0 3,5 1,0 3,5 5,0 'ist das gewünschte Ergebnis. –

Antwort

23

interaction tut, was Sie brauchen:

> rank(interaction(c(2,4,1,4,5),c(10,11,12,11,13), lex.order=TRUE)) 
[1] 2.0 3.5 1.0 3.5 5.0 

Hier ist, was geschieht.

interaction erwartet Faktoren, so dass die Vektoren erzwungen werden. Dies erzeugt die Reihenfolge in den Faktorstufen, wie durch sort.list angezeigt, die für numeric numerisch nicht abnehmende Reihenfolge ist.
Um dann die beiden Faktoren zu kombinieren, erstellt die Interaktion Faktoren Ebenen durch Variieren der zweiten Argument am schnellsten (weil lex.order=TRUE). Somit werden Bindungen in dem ersten Vektor durch den Wert in dem zweiten Vektor (falls möglich) aufgelöst.
Schließlich rank erzwingt der resultierende Faktor numeric.

Was tatsächlich auf Rang:

> as.numeric(interaction(c(2,4,1,4,5),c(10,11,12,11,13), lex.order=TRUE)) 
[1] 5 10 3 10 16 

Sie etwas Speicher sparen, wenn Sie die Option drop=TRUE-interaction liefern. Dadurch werden die numerischen Rangwerte geändert, aber nicht ihre Reihenfolge, sodass das Endergebnis gleich ist.

+0

Ich habe nicht überprüft, aber tut "lex.order" etwas seltsam, wenn es Eingabe gibt, wo numerische und nicht lexikalische Reihenfolge erwünscht ist, z.B. 'c (10,2,12,2,13)' ...? –

+0

'rank' erzwingt das Ergebnis von' interaction' auf numerisch, also nein. 'lex.order' bedeutet nicht, alphabetisch zu sortieren. –

+0

Danke, Matthew. Das ist toll. – user1939887

Verwandte Themen