2010-02-21 3 views
5

Was ist der effizienteste Weg, um zwei Vektoren in Lockstep in R zu sortieren? Der erste Vektor sollte in aufsteigender Reihenfolge sortiert werden, und der zweite sollte im Gleichschritt neu angeordnet werden, so dass Elemente mit entsprechenden Indizes vor der Sortierung nach der Sortierung immer noch entsprechende Indizes haben. Zum Beispiel:Der effizienteste Weg, um zwei Vektoren in Lockstep in R zu sortieren?

foo <- c(1,3,2, 5,4) 
bar <- c(2,6,4,10,8) 
sort2(foo, bar) 

# foo == c(1,2,3,4, 5) 
# bar == c(2,4,6,8,10) 

Hinweis: Die Effizienz ist ein absolutes Muss hier wie ich versuche, dies als Basis zu verwenden, zum Erstellen eines O (N log N) Implementierung von Kendall-Tau als Patch einzureichen. Ich würde gerne vermeiden, meine eigene spezielle Funktion in C zu schreiben, um dies zu tun, aber wäre bereit, wenn es nicht effizient innerhalb von R getan werden kann.

Antwort

8

Nicht sicher, verstehe ich aber ist diese Verwendung von order() was Sie wollen :

R> foo <- c(1,3,2, 5,4) 
R> bar <- c(2,6,4,10,8) 
R> fooind <- order(foo) # index of ordered 
R> foo[fooind] 
[1] 1 2 3 4 5 
R> bar[fooind] 
[1] 2 4 6 8 10 
R> 
+0

Dank. Dies ist nicht der effizienteste Weg (eine zusätzliche Indirektion ist involviert), aber es ist definitiv gut genug. – dsimcha

+4

Dies ist * der effizienteste Weg. R verändert Objekte nicht an Ort und Stelle - und wenn Sie den Quellcode für 'sort.default' betrachten, werden Sie sehen, dass intern' order() 'verwendet wird. – hadley

0

ich bin nicht sicher, dass die akzeptierte Antwort in Fällen richtig ist, in der X zuerst sortiert ist, dann Y durch den Index der (sortiert) X sortiert ist, dass, wenn doppelte Werte in X, Y wird nicht immer in der klassischen Reihenfolge nach x, y sortiert. Zum Beispiel:

> x <- c(3,2,2,2,1) 
> y <- c(5,4,3,2,1) 
> xind <- order(x) 
> x[xind] 
[1] 1 2 2 2 3 
> y[xind] 
[1] 1 4 3 2 5 

Y wird durch die neue Ordnung der X bestellt, aber nicht in Lockstep, da nicht alle des X-Indizes geändert. Eine einfache Funktion wie die OP tun erforderlich:

> sort.xy <- function(x,y) 
+ { 
+ df.xy <- data.frame(x,y) 
+ df.xy[ order(df.xy[,1], df.xy[,2]), ] 
+ } 

Im Einsatz:

> c(sort.xy(x,y)) 
$x 
[1] 1 2 2 2 3 

$y 
[1] 1 2 3 4 5