Dies scheint es zu erklären.
Die Definition von order
ist, 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 rank
sagt Ihnen , in welcher Reihenfolge die Zahlen sind in,
order
erfahren Sie , wie sie in aufsteigender Reihenfolge erhalten.
plot(a, rank(a)/length(a))
gibt eine Grafik der CDF. Um zu sehen, warum dies
order
nü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.
order(a, decreasing = T)
undrank(a)
wird eine äquivalente Antwort zurückgeben.a<-c(4,2,1,80,13)
Dannorder(a)
sollte es sein3 4 5 1 2
, aber seltsamerweise3 2 1 5 4
rank
undorder
dasselbe?order(order(a))
wird das gleiche zurückgegeben, alsrank(a)
ob es keine Bindungen gibt. Wenn ja, wird das gleiche zurückgegeben wierank(a, ties.method="first")
.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.
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:
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:
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' :
(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 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.
quelle
(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:
So
order(a)
heißt es: "Setzen Sie das dritte Element beim Sortieren anrank(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 wirorder()
zum Sortieren verwenden können, aber wir können nicht aufrank()
diese Weise verwenden:Im Allgemeinen ist
order()
nicht gleich, esrank()
sei denn, der Vektor wurde bereits sortiert: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:quelle
order
undrank
sind tatsächlich invers zueinander (zumindest solange die Werte ina
eindeutig sind). Wenn Sie sich vorstellen, dass jeder Name (/ Beschriftungen) ('1', '2', '3', '4') auf seinen Werten hat, dann geben die Werte von anorder(a)
, in welcher Position inrank(a)
jedem Etikett (z. B. der 1. Wert vonorder(a)
(3) sagt Ihnen, dass '1' an der 3. Position von auftrittrank(a)
und umgekehrt (z. B.rank(a)
sagt der 2. Wert von (3), dass '2' an der 3. Position von auftrittorder(a)
). Sie sind inverse Permutationen:rank(order(a))
=order(rank(a))
=1 2 3 4
Durch Ausführen dieses kleinen Codes konnte ich die Bestellfunktion verstehen
Referenz: http://r.789695.n4.nabble.com/I-don-t-understand-the-order-function-td4664384.html
quelle
x
in verwendet habencbind()
.Dies könnte Ihnen irgendwann helfen.
Was Sie bekommen, ist
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.
quelle
In einfachen Worten,
order()
die Positionen von Elementen mit zunehmender Größe an.Zum Beispiel
order(c(10,20,30))
wird 1,2,3 undorder(c(30,20,10))
wird 3,2,1 geben .quelle
Sie sind ähnlich, aber nicht gleich
quelle
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.