Datenrahmen in R nach mehreren Spalten sortieren
In diesem Artikel werden wir uns anschauen, wie man Datenrahmen (data.frame
) nach mehreren Spalten sortiert (direkt zur Antwort).
Dazu werden wir folgenden Beispiel-Datenrahmen:
dataframe <- data.frame(
x = c("Apfel", "Orange", "Banane", "Himbeere"),
y = c("a", "d", "b", "c"),
z = c(4:1)
)
Unser Datenrahmen würde damit so aussehen:
# | x | y | z |
---|---|---|---|
1 | Apfel | a | 4 |
2 | Orange | b | 3 |
3 | Banane | c | 2 |
4 | Himbeere | d | 1 |
Die order
-Funktion
Auch wenn sie vielleicht nicht die einfachste Sortiermethode in Bezug auf den Syntax ist, ist die order
-Funktion diejenige, die für alle R-Installationen am leichtesten verfügbar ist, da sie Teil des Basismoduls ist.
Die order
-Funktion akzeptiert eine Reihe von Argumenten, aber auf der einfachsten Ebene muss das erste Argument eine Folge von Werten oder logischen Vektoren sein.
Beispielsweise können wir mit order()
einen Vektor von fünf zufällig geordneten Zahlen einfach sortieren:
vec = c(3, 5, 1, 4, 2)
vec[order(vec)]
# vorher:
# [1] 3 5 1 4 2
# nachher:
# [1] 1 2 3 4 5
Einen Datenrahmen nach dem Vektornamen sortieren
Mit der order()-Funktion in unserem Werkzeuggürtel beginnen wir mit dem Sortieren unseres Datenrahmens, indem wir die Vektornamen innerhalb des Datenrahmens übergeben.
Wenn wir zum Beispiel unser zuvor generiertes Datenrahmenobjekt verwenden, können wir nach der Spalte z so sortieren:
dataframe[
with(dataframe, order(z)),
]
Wir rufen effektiv unser ursprüngliches Datenrahmenobjekt auf und geben die neue Indexreihenfolge ein, die wir gerne hätten. Diese Indexreihenfolge wird mit der Funktion with()
erzeugt, während die Reihenfolge mit order()
bestimmt wird.
Wir rufen den Datenrahmen auf und übergeben in den eckigen Klammern quasi die Reihenfolge, die wir haben wollen. Wenn wir order(z)
gegen austauschen würden, also dataframe[1:4,]
aufrufen würden, hätten wir unseren Datenrahmen nicht verändert. Dieser Befehl gibt uns einfach den Datenrahmen, wir er gerade ist, mit den Zeilen von 1 bis 4. Wenn wir allerdings stattdessen 4:1 schreiben, also dataframe[4:1,]
aufrufen, erhalten wir unseren Datenrahmen in umgekehrter Reihenfolge. Alles, was order(z)
also macht, ist, uns die Indizes eines sortieren Datenrahmens zu geben, mit dem wir dann die ursprünglichen Datenrahmen aufrufen.
Einen Datenrahmen nach dem Spaltenindex sortieren
Anstatt nach dem Namen zu sortieren, hätten wir auch nach dem Index sortieren lassen können.Um nach der ersten Spalte (die mit den Obst) sortieren zu lassen, würden wir folgenden Code aufrufen:
dataframe[
order( dataframe[,1] ),
]
Dieser Syntax ist zwar einfacher, aber potentiell auch fehleranfälliger, da wir zum einen aufpassen müssen, den richtigen Index einzugeben (was gerade bei größeren Datenrahmen schwieriger ist) und sicherstellen müssen, dass sich die Struktur (und damit auch der Index) nicht mehr verändert.
Nach mehreren Spalten sortieren
In einigen Fällen kann es erforderlich sein, nach mehreren Spalten zu sortieren. Dies funktioniert analog zu den oben beschrieben Beispielen, nur das wir jetzt noch ein weiteres Argument hinzufügen:
# Datenrahmen nach der Spalten x und dann nach y sortieren
dataframe[
with(dataframe, order(x, y)),
]
# Datenrahmen nach der ersten, dann der zweiten Spalte sortieren
dataframe[
order( dataframe[,1], dataframe[,2] ),
]