R-Datenrahmen sortieren: order()-Funktion mit Beispiel
⚡ Intelligente Zusammenfassung
Das Sortieren eines Dataframes in R erfolgt mithilfe der Funktion `order()`, die Zeilenpositionen anstelle von Werten zurückgibt. Durch die Übergabe dieser Positionen in eckigen Klammern werden die Zeilen entweder um eine Spalte, um mehrere Spalten oder in absteigender Reihenfolge neu angeordnet.
Daten sortieren in R
In der Datenanalyse können Sie sortieren Ihre Daten entsprechend einer bestimmten Variable im Datensatz. In R können wir die Hilfe der Funktion order() nutzen. In R können wir einen Vektor einer kontinuierlichen Variablen oder Faktorvariablen leicht sortieren. Das Anordnen der Daten kann von erfolgen aufsteigend or absteigend Ordnung.
Syntax:
sort(x, decreasing = FALSE, na.last = NA)
Streit:
- xEin Vektor, der eine stetige oder eine Faktorvariable enthält
- abnehmend: Steuert die Sortierrichtung. Standardmäßig ist die absteigende Sortierung auf FALSE gesetzt, was zu einer aufsteigenden Sortierung führt.
- na.lastGibt an, ob NA-Werte ans Ende der Liste gesetzt werden sollen. `sort()` verwendet standardmäßig NA und verwirft fehlende Werte; `order()` verwendet TRUE, behält sie bei und platziert sie am Ende der Liste.
sort() vs order() vs rank() in R
Die obige Syntax gehört zur Funktion `sort()`, doch alle Beispiele auf dieser Seite verwenden `order()`. Die beiden Funktionen beantworten unterschiedliche Fragen, und die Verwechslung dieser Funktionen ist der häufigste Grund dafür, dass ein Sortiervorgang scheinbar fehlschlägt. `rank()` vervollständigt das Trio.
| Funktion | Rücksendungen | Verwenden Sie es, wenn | Standardmäßige NA-Behandlung |
|---|---|---|---|
| Sortieren() | Die Werte selbst, der Reihe nach | Sie benötigen lediglich einen sortierten Vektor. | na.last = NA, daher wird NA gelöscht |
| Befehl() | Die Zeilenpositionen, die die sortierte Reihenfolge erzeugen | Sie müssen einen gesamten Datenrahmen neu anordnen. | na.last = TRUE, daher steht NA an letzter Stelle. |
| Rang() | Der Rang jedes Elements an seiner ursprünglichen Position | Sie benötigen eine Rangspalte, keine neu sortierte Tabelle. | na.last = TRUE |
Da order() Positionen zurückgibt, ist es die einzige der drei Funktionen, die die auf dieser Seite verwendete eckige Klammer-Teilmengenbildung steuern kann. R-Basisdokumentation für order() listet alle Argumente auf, einschließlich des Methodenarguments, das den Sortieralgorithmus auswählt.
Beispiel 1: Sortieren eines Dataframes nach einer Spalte
Wir können beispielsweise einen Tibble-Dataframe erstellen und eine oder mehrere Variablen sortieren. Ein Tibble-Dataframe ist eine moderne Variante des … DatenrahmenEs verbessert die Syntax des Dataframes und vermeidet umständliche Datenformatierungen, insbesondere die Umwandlung von Zeichenketten in Zahlen. Außerdem ist es eine bequeme Möglichkeit, einen Dataframe manuell zu erstellen, was hier unser Ziel ist. Weitere Informationen zu Tibble finden Sie in der Vignette. https://tibble.tidyverse.org/articles/tibble.html
Der unten stehende Code erstellt ein 50-zeiliges Tibble mit fünf zufälligen Spalten und sortiert anschließend jede Zeile nach den Werten in c1. set.seed(1234) fixiert die Zufallsauswahl, sodass auf jedem Rechner die gleichen Zahlen erscheinen.
library(dplyr) set.seed(1234) data_frame <- tibble( c1 = rnorm(50, 5, 1.5), c2 = rnorm(50, 5, 1.5), c3 = rnorm(50, 5, 1.5), c4 = rnorm(50, 5, 1.5), c5 = rnorm(50, 5, 1.5) ) # Sort by c1 df <-data_frame[order(data_frame$c1),] head(df)
Ausgang:
# A tibble: 6 x 5 ## c1 c2 c3 c4 c5 ## <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 1.481453 3.477557 4.246283 3.686611 6.0511003 ## 2 1.729941 5.824996 4.525823 6.753663 0.1502718 ## 3 2.556360 6.275348 2.524849 6.368483 5.4787404 ## 4 2.827693 4.769902 5.120089 3.743626 4.0103449 ## 5 2.988510 4.395902 2.077631 4.236894 4.6176880 ## 6 3.122021 6.317305 5.413840 3.551145 5.6067027
Das Komma vor der schließenden Klammer ist wichtig: df[order(…), ] ordnet die Zeilen neu an, während df[, order(…)] stattdessen die Spalten neu anordnen würde.
Beispiel 2: Sortieren nach mehreren Spalten
Jedes zusätzliche Argument, das an `order()` übergeben wird, dient als Entscheidungskriterium für das vorhergehende Argument. Hier wird der Frame nach `c3` sortiert, und Zeilen mit demselben `c3`-Wert werden anschließend nach `c4` sortiert.
# Sort by c3 and c4
df <-data_frame[order(data_frame$c3, data_frame$c4),]
head(df)
Ausgang:
# A tibble: 6 x 5 ## c1 c2 c3 c4 c5 ## <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 2.988510 4.395902 2.077631 4.236894 4.617688 ## 2 2.556360 6.275348 2.524849 6.368483 5.478740 ## 3 3.464516 3.914627 2.730068 9.565649 6.016123 ## 4 4.233486 3.292088 3.133568 7.517309 4.772395 ## 5 3.935840 2.941547 3.242078 6.464048 3.599745 ## 6 3.835619 4.947859 3.335349 4.378370 7.240240
Beispiel 3: Eine Spalte absteigend und eine andere aufsteigend sortieren
Jede Spalte kann ihre eigene Sortierrichtung haben. Durch das Voranstellen eines Minuszeichens vor eine numerische Spalte wird nur diese Spalte umgekehrt. Die folgende Sortierung erfolgt daher absteigend in Spalte C3 und aufsteigend in Spalte C4.
# Sort by c3(descending) and c4(ascending)
df <-data_frame[order(-data_frame$c3, data_frame$c4),]
head(df)
Ausgang:
# A tibble: 6 x 5 ## c1 c2 c3 c4 c5 ## <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 4.339178 4.450214 8.087243 4.5010140 8.410225 ## 2 3.959420 8.105406 7.736312 7.1168936 5.431565 ## 3 3.339023 3.298088 7.494285 5.9303153 7.035912 ## 4 3.397036 5.382794 7.092722 0.7163620 5.620098 ## 5 6.653446 4.733315 6.520536 0.9016707 4.513410 ## 6 4.558559 4.712609 6.380086 6.0562703 5.044277
Der Trick mit dem Minuszeichen funktioniert nur bei numerischen Spalten. Für Spalten mit Zeichenketten oder Faktoren verwenden Sie `order(xtfrm(df$col), decrease = TRUE)` oder wechseln Sie zum im Folgenden gezeigten `dplyr`-Ansatz.
Sortieren Sie einen DataFrame mit dplyr arrange()
Die eckige Klammerkonstruktion wird schwer lesbar, sobald mehrere Spalten und Richtungen involviert sind, da der Rahmenname innerhalb jedes Arguments wiederholt wird. dplyr Die Funktion `arrange()` beseitigt diese Wiederholungen: Spalten werden nur einmal benannt, und `desc()` kennzeichnet diejenigen, die rückwärts laufen.
library(dplyr) # The same three sorts written with arrange() data_frame %>% arrange(c1) # Example 1 data_frame %>% arrange(c3, c4) # Example 2 data_frame %>% arrange(desc(c3), c4) # Example 3
Drei praktische Unterschiede sind es wert, bekannt zu sein:
- Ablesbarkeit: arrange(desc(c3), c4) drückt die Absicht direkt aus, während order(-data_frame$c3, data_frame$c4) sie hinter einem Minuszeichen verbirgt.
- Spaltentypen: desc() funktioniert sowohl mit Zeichen- und Faktorspalten als auch mit numerischen Spalten, daher ist kein xtfrm()-Workaround erforderlich.
- Fehlende Werte: arrange() platziert NA immer an letzter Stelle, unabhängig von der Richtung, während order() es Ihnen ermöglicht, sie mit na.last zu verschieben.
Die Funktion `arrange()` gibt einen neuen Datenrahmen zurück und lässt den ursprünglichen unverändert, genau wie die Version mit eckigen Klammern. Daher muss dem Ergebnis weiterhin ein Name zugewiesen werden, damit es gespeichert werden kann. Gruppierte Datenrahmen werden innerhalb jeder Gruppe nur dann sortiert, wenn `.by_group = TRUE` angegeben ist.
Sortieren von Zeichenketten, Faktoren und fehlenden Werten in R
Numerische Spalten lassen sich vorhersehbar sortieren. Textspalten, Kategorienspalten und Lückenspalten hingegen nicht, und für jede dieser drei Spalten ist eine andere Entscheidung erforderlich.
Fehlende Werte. Die Funktionen sort() und order() sind sich uneinig darüber, wie mit NA-Werten umzugehen ist. Deshalb kann dieselbe Spalte zwei unterschiedliche Zeilenanzahlen ergeben:
x <- c(3, NA, 1, 2) sort(x) # missing values dropped sort(x, na.last = TRUE) # missing values pushed to the end order(x) # NA indexed last by default order(x, na.last = FALSE) # NA indexed first
Faktoren. A Faktor Die Sortierung erfolgt nach der Reihenfolge der Ebenen, nicht alphabetisch. Genau das ist erwünscht für geordnete Kategorien wie niedrig, mittel und hoch, und genau das ist unerwünscht, wenn die Ebenen in der Reihenfolge erstellt wurden, in der die Werte zufällig auftraten:
grades <- factor(c("low", "high", "medium"), levels = c("low", "medium", "high")) sort(grades) # follows the level order sort(as.character(grades)) # plain alphabetical order
Zeichenspalten. Klartext wird nach der lokalen Sortierreihenfolge sortiert, daher können Groß- und Kleinschreibung sowie Akzente das Ergebnis je nach Rechner beeinflussen. Zwei Vorgehensweisen helfen, Überraschungen zu vermeiden: Prüfen Sie vor dem Sortieren die Klasse (class(df$col)) und wandeln Sie als Text gespeicherte Ziffern mit as.numeric() um, damit beispielsweise „10“ nicht vor „2“ landet.

