Grundlegendes zur Funktion order ()

87

Ich versuche zu verstehen, wie die order()Funktion funktioniert. Ich hatte den Eindruck, dass es eine Permutation von Indizes zurückgibt, die beim Sortieren den ursprünglichen Vektor sortieren würde.

Zum Beispiel,

> a <- c(45,50,10,96)
> order(a)
[1] 3 1 2 4

Ich hätte erwartet, dass dies zurückkommt c(2, 3, 1, 4), da die sortierte Liste 10 45 50 96 wäre.

Kann mir jemand helfen, den Rückgabewert dieser Funktion zu verstehen?

jeffshantz
quelle

Antworten:

100

Dies scheint es zu erklären.

Die Definition von orderist, dass a[order(a)]in aufsteigender Reihenfolge. Dies funktioniert mit Ihrem Beispiel, bei dem die richtige Reihenfolge das vierte, zweite, erste und dann dritte Element ist.

Sie können gesucht haben rank, die den Rang der Elemente gibt ,
R> a <- c(4.1, 3.2, 6.1, 3.1)
R> order(a)
[1] 4 2 1 3
R> rank(a)
[1] 3 2 4 1
so ranksagt Ihnen , in welcher Reihenfolge die Zahlen sind in, ordererfahren Sie , wie sie in aufsteigender Reihenfolge erhalten.

plot(a, rank(a)/length(a))gibt eine Grafik der CDF. Um zu sehen, warum dies ordernützlich ist, versuchen Sie plot(a, rank(a)/length(a),type="S") , was zu einem Durcheinander führt, da die Daten nicht in aufsteigender Reihenfolge vorliegen

Wenn Sie dies getan haben
oo<-order(a)
plot(a[oo],rank(a[oo])/length(a),type="S")
oder einfach nur
oo<-order(a)
plot(a[oo],(1:length(a))/length(a)),type="S")
ein Liniendiagramm der CDF erhalten.

Ich wette, du denkst an Rang.

Duffymo
quelle
8
Ahh .. ich verstehe jetzt. order () gibt die Indizes des Vektors in sortierter Reihenfolge zurück. Wunderbar, vielen Dank.
Jeffshantz
order(a, decreasing = T)und rank(a)wird eine äquivalente Antwort zurückgeben.
Omar
Ich habe ein Problem mit der Bestellung. a<-c(4,2,1,80,13)Dann order(a)sollte es sein 3 4 5 1 2, aber seltsamerweise 3 2 1 5 4
bekomme
1
@duffymo eine kleine Hilfe hier wäre sehr dankbar. Wann ist rankund orderdasselbe?
Shoham Debnath
Eigentlich order(order(a))wird das gleiche zurückgegeben, als rank(a) ob es keine Bindungen gibt. Wenn ja, wird das gleiche zurückgegeben wie rank(a, ties.method="first").
Jac
33

Um einen 1D-Vektor oder eine einzelne Datenspalte zu sortieren, rufen Sie einfach die Sortierfunktion auf und übergeben Sie Ihre Sequenz.

Auf der anderen Seite die Reihenfolge ist Funktion notwendige Daten zu sortieren zwei - dimensionale Daten -heißt, mehr Spalten von Datenin einer Matrix oderDatenrahmen gesammelt.

Stadium Home Week Qtr Away Off Def Result       Kicker Dist
751     Out  PHI   14   4  NYG PHI NYG   Good      D.Akers   50
491     Out   KC    9   1  OAK OAK  KC   Good S.Janikowski   32
702     Out  OAK   15   4  CLE CLE OAK   Good     P.Dawson   37
571     Out   NE    1   2  OAK OAK  NE Missed S.Janikowski   43
654     Out  NYG   11   2  PHI NYG PHI   Good      J.Feely   26
307     Out  DEN   14   2  BAL DEN BAL   Good       J.Elam   48
492     Out   KC   13   3  DEN  KC DEN   Good      L.Tynes   34
691     Out  NYJ   17   3  BUF NYJ BUF   Good     M.Nugent   25
164     Out  CHI   13   2   GB CHI  GB   Good      R.Gould   25
80      Out  BAL    1   2  IND IND BAL   Good M.Vanderjagt   20

Hier ist ein Auszug von Daten für Feldtorversuche in der NFL-Saison 2008, ein Datenrahmen, den ich 'fg' genannt habe. Angenommen, diese 10 Datenpunkte repräsentieren alle im Jahr 2008 versuchten Feldziele. Angenommen, Sie möchten wissen, wie weit das längste in diesem Jahr versuchte Feldtor entfernt ist, wer es getreten hat und ob es gut war oder nicht. Sie möchten auch die zweitlängste sowie die drittlängste usw.; und schließlich möchten Sie den kürzesten Feldtorversuch.

Nun, Sie könnten einfach Folgendes tun:

sort(fg$Dist, decreasing=T)

was zurückgibt: 50 48 43 37 34 32 26 25 25 20

Das ist richtig, aber nicht sehr nützlich - es gibt Auskunft über die Entfernung des längsten Feldtorversuchs, des zweitlängsten, ... sowie des kürzesten; Aber das ist alles, was wir wissen - z. B. wissen wir nicht, wer der Kicker war, ob der Versuch erfolgreich war usw. Natürlich müssen wir den gesamten Datenrahmen in der Spalte "Dist" sortieren (anders ausgedrückt, wir Sie möchten alle Datenzeilen nach dem einzelnen Attribut Dist . sortieren , das folgendermaßen aussehen würde:

Stadium Home Week Qtr Away Off Def Result       Kicker Dist
751     Out  PHI   14   4  NYG PHI NYG   Good      D.Akers   50
307     Out  DEN   14   2  BAL DEN BAL   Good       J.Elam   48
571     Out   NE    1   2  OAK OAK  NE Missed S.Janikowski   43
702     Out  OAK   15   4  CLE CLE OAK   Good     P.Dawson   37
492     Out   KC   13   3  DEN  KC DEN   Good      L.Tynes   34
491     Out   KC    9   1  OAK OAK  KC   Good S.Janikowski   32
654     Out  NYG   11   2  PHI NYG PHI   Good      J.Feely   26
691     Out  NYJ   17   3  BUF NYJ BUF   Good     M.Nugent   25
164     Out  CHI   13   2   GB CHI  GB   Good      R.Gould   25
80      Out  BAL    1   2  IND IND BAL   Good M.Vanderjagt   20

Das macht die Bestellung . Es ist 'sort' für zweidimensionale Daten; Anders ausgedrückt, es wird ein 1D-Ganzzahlindex zurückgegeben, der aus den Zeilennummern besteht, sodass Sie durch Sortieren der Zeilen nach diesem Vektor eine korrekte zeilenorientierte Sortierung in der Spalte Dist erhalten

So funktioniert das. Oben wurde sort verwendet, um die Dist-Spalte zu sortieren. Um den gesamten Datenrahmen in der Dist-Spalte zu sortieren, verwenden wir 'order' genauso wie oben 'sort' :

ndx = order(fg$Dist, decreasing=T)

(Normalerweise binde ich das von 'order' zurückgegebene Array an die Variable 'ndx', die für 'index' steht, weil ich es als Indexarray zum Sortieren verwenden werde.)

Das war Schritt 1, hier ist Schritt 2:

'ndx', was von 'sort' zurückgegeben wird, wird dann als Indexarray verwendet, um den Datenrahmen 'fg' neu zu ordnen:

fg_sorted = fg[ndx,]

fg_sorted ist der neu geordnete Datenrahmen unmittelbar darüber.

In der Summe wird 'sort' verwendet, um ein Indexarray zu erstellen (das die Sortierreihenfolge der zu sortierenden Spalte angibt), das dann als Indexarray verwendet wird, um den Datenrahmen (oder die Matrix) neu zu ordnen.

Doug
quelle
2
-1: Ordnung macht für einen Vektor ziemlich Sinn. Die grundlegende Eigenschaft der Ordnung - dass eine [Ordnung (a)] sortiert ist - ist nicht klar angegeben.
Jyotirmoy Bhattacharya
2
Falsch. Sie müssen noch einmal nachsehen - die 'Grundeigenschaft' wird in der Tat sehr deutlich in den beiden obigen Codezeilen (grauer Hintergrund) angezeigt. Da das Sortieren mit 'order' zwei separate Operationen sind, habe ich dies mit zwei Codezeilen gezeigt - eine, die den Indexvektor erstellt, und die zweite Zeile, die diesen Index verwendet, um die Sortierung durchzuführen. Das OP bat um eine Erklärung, nicht nur um ein Ergebnis, und ich gab ihm eine, was durch die Tatsache belegt wird, dass er meine Antwort auswählte und die kurze Notiz über "Danke [m] akes perfect sense" schrieb. Ich habe das Endergebnis sogar an eine Variable namens "fg_sorted" gebunden.
Doug
23

(Ich dachte, es könnte hilfreich sein, die Ideen hier sehr einfach darzulegen, um das gute Material zusammenzufassen, das von @doug gepostet und von @duffymo verlinkt wurde; +1 mit jedem, übrigens.)

Die Reihenfolge gibt an, welches Element des ursprünglichen Vektors zuerst, zweitens usw. gesetzt werden muss, um den ursprünglichen Vektor zu sortieren, während der Rang angibt, welches Element den niedrigsten, zweitniedrigsten usw. Wert hat. Beispielsweise:

> a <- c(45, 50, 10, 96)
> order(a)  
[1] 3 1 2 4  
> rank(a)  
[1] 2 3 1 4  

So order(a)heißt es: "Setzen Sie das dritte Element beim Sortieren an rank(a)die erste Stelle ...", während Sie sagen: "Das erste Element ist das zweitniedrigste ...". (Beachten Sie, dass beide übereinstimmen, welches Element am niedrigsten ist usw .; Sie präsentieren die Informationen nur unterschiedlich.) Wir sehen also, dass wir order()zum Sortieren verwenden können, aber wir können nicht auf rank()diese Weise verwenden:

> a[order(a)]  
[1] 10 45 50 96  
> sort(a)  
[1] 10 45 50 96  
> a[rank(a)]  
[1] 50 10 45 96  

Im Allgemeinen ist order()nicht gleich, es rank()sei denn, der Vektor wurde bereits sortiert:

> b <- sort(a)  
> order(b)==rank(b)  
[1] TRUE TRUE TRUE TRUE  

Da order()es sich (im Wesentlichen) um Ränge der Daten handelt, können Sie diese zusammenstellen, ohne die Informationen zu beeinflussen. Umgekehrt führt dies jedoch zu Kauderwelsch:

> order(rank(a))==order(a)  
[1] TRUE TRUE TRUE TRUE  
> rank(order(a))==rank(a)  
[1] FALSE FALSE FALSE  TRUE  
gung - Monica wieder einsetzen
quelle
1
orderund ranksind tatsächlich invers zueinander (zumindest solange die Werte in aeindeutig sind). Wenn Sie sich vorstellen, dass jeder Name (/ Beschriftungen) ('1', '2', '3', '4') auf seinen Werten hat, dann geben die Werte von an order(a), in welcher Position in rank(a)jedem Etikett (z. B. der 1. Wert von order(a)(3) sagt Ihnen, dass '1' an der 3. Position von auftritt rank(a)und umgekehrt (z. B. rank(a)sagt der 2. Wert von (3), dass '2' an der 3. Position von auftritt order(a)). Sie sind inverse Permutationen: rank(order(a))= order(rank(a))=1 2 3 4
Glen_b
"? order gibt an, welches Element des ursprünglichen Vektors zuerst, zweitens usw. gesetzt werden muss, um den ursprünglichen Vektor zu sortieren, während? rank Ihnen sagt, welches Element den niedrigsten, zweitniedrigsten usw. Wert hat." Dort. Das ist alles, was jemand zu sagen hatte. Schließlich. Danke dir!!
AleksandrH
prägnant erklärt .. was man braucht "? Die Reihenfolge sagt Ihnen, welches Element des ursprünglichen Vektors zuerst, zweitens usw. gesetzt werden muss, um den ursprünglichen Vektor zu sortieren, während? Rang Ihnen sagt, welches Element das niedrigste, zweitniedrigste hat usw. Wert. "
sHiBuKaLiDhAsAn
9

Durch Ausführen dieses kleinen Codes konnte ich die Bestellfunktion verstehen

x <- c(3, 22, 5, 1, 77)

cbind(
  index=1:length(x),
  rank=rank(x),
  x, 
  order=order(x), 
  sort=sort(x)
)

     index rank  x order sort
[1,]     1    2  3     4    1
[2,]     2    4 22     1    3
[3,]     3    3  5     3    5
[4,]     4    1  1     2   22
[5,]     5    5 77     5   77

Referenz: http://r.789695.n4.nabble.com/I-don-t-understand-the-order-function-td4664384.html

Adebesin
quelle
1
Das Ergebnis stimmt nicht mit der Eingabe überein. Sie müssen ein anderes xin verwendet haben cbind().
Rich Scriven
In Bezug auf die obigen Kommentare geändert. Hoffe das hilft :)
Adebesin
2

Dies könnte Ihnen irgendwann helfen.

a <- c(45,50,10,96)
a[order(a)]

Was Sie bekommen, ist

[1] 10 45 50 96

Der Code, den ich geschrieben habe, gibt an, dass Sie "a" als ganze Teilmenge von "a" möchten und dass es vom niedrigsten zum höchsten Wert geordnet werden soll.

Alejandro Carrera
quelle
2

In einfachen Worten, order() die Positionen von Elementen mit zunehmender Größe an.

Zum Beispiel order(c(10,20,30))wird 1,2,3 und order(c(30,20,10))wird 3,2,1 geben .

Arnab Jana
quelle
0

Sie sind ähnlich, aber nicht gleich

set.seed(0)
x<-matrix(rnorm(10),1)

# one can compute from the other
rank(x)  == col(x)%*%diag(length(x))[order(x),]
order(x) == col(x)%*%diag(length(x))[rank(x),]
# rank can be used to sort
sort(x) == x%*%diag(length(x))[rank(x),]
Nick Nassuphis
quelle
Rang ist die inverse Permutation der Ordnung: all(x==x[order(x)][rank(x)])ist immer wahr. Einige Permutationen sind ihre eigenen Umkehrungen, die meisten jedoch nicht. Die Umkehrung der Sortierpermutation, die aus der Reihenfolge () kommt, ist rank (). Dies erklärt, warum sie manchmal gleich sind und manchmal nicht.
Nick Nassuphis