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.

  • 🔢 Grundlagen der order()-Funktion: Die Funktion order() gibt die Zeilenindizes zurück, die eine Spalte in aufsteigender Reihenfolge anordnen, nicht die sortierten Werte selbst.
  • 📌 Einzelspaltig: df[order(df$c1), ] ordnet jede Zeile des Frames anhand der in c1 gespeicherten Werte neu an.
  • 🧮 Mehrere Spalten: Zusätzliche Argumente dienen als Entscheidungskriterien bei Gleichstand, daher sortiert order(df$c3, df$c4) zuerst nach c3 und dann nach c4.
  • ???? Absteigende Reihenfolge: Eine numerische Spalte wird mit einem Minuszeichen versehen oder mit decreaseing = TRUE an sort() übergeben.
  • 🧩 tidyverse Route: arrange() und desc() drücken genau die gleichen Sortierungen aus wie lesbare dplyr-Verben.
  • ⚠️ Fehlende Werte: order() platziert NA standardmäßig am Ende, während sort() fehlende Werte entfernt, es sei denn, na.last ist festgelegt.

R Sortieren Sie einen Datenrahmen mit Order()

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.

Häufig gestellte Fragen

Verwenden Sie `df[order(rownames(df)), ]`. Zeilennamen sind vom Typ Zeichenkette, daher erfolgt die Sortierung nach Textklassifizierung, und „10“ landet vor „2“. Verwenden Sie `as.numeric()`, wenn sie numerisch sind. Tibbles entfernen Zeilennamen vollständig; fügen Sie stattdessen eine explizite ID-Spalte hinzu.

Übergibt man `method = "radix"` an `order()`, ist dies die schnellste Option für Ganzzahlen und kurze Zeichenketten. Bei Millionen von Zeilen sortiert `data.table::setorder()` die Tabelle direkt, ohne sie zu kopieren, und die dplyr-Funktion `arrange()` verwendet intern bereits eine Radixsortierung.

Index mit umgekehrter Sequenz: df[nrow(df):1, ]. Dies kehrt die aktuelle Reihenfolge um, anstatt sie zu sortieren. Dies ist relevant, wenn der Frame gemischt oder gruppiert wurde. Setzen Sie die Beschriftungen anschließend mit rownames(df) <- NULL zurück, falls sie verwirrend erscheinen.

Die Spalte ist als Zeichenkette oder Faktor gespeichert, daher vergleicht R sie als Text und setzt „10“ vor „2“. Prüfen Sie mit `class(df$col)`, ob es sich um einen numerischen Datentyp handelt, und konvertieren Sie ihn dann vor der Sortierung mit `as.numeric(as.character(df$col))`.

Nein. `order()` gibt einen Indexvektor zurück, und `df[order(…), ]` erzeugt einen neuen Frame. Der ursprüngliche Frame bleibt also unverändert, bis das Ergebnis zurückgegeben wird. Die Zeilennamen behalten ihre alten Werte, was ein nützlicher Hinweis darauf ist, dass der Frame neu geordnet wurde.

KI-Assistenten können erkennen, wenn eine numerische Sortierung fehlerhaft erscheint, indem sie eine als Text gespeicherte Spalte identifizieren. Sie können einen `order()`-Aufruf aus der Basis-R-Methode in eine dplyr-Pipeline übersetzen und eine geeignete Spalte für den Fall von Gleichstand vorschlagen. Führen Sie den Code immer aus und überprüfen Sie `head()`, bevor Sie dem Ergebnis vertrauen.

Ja. GitHub-Copilot Funktioniert in RStudio Desktop 2023.09.0 und höher und vervollständigt Aufrufe von `order()` und `arrange()` anhand eines einfachen Kommentars. Posit weist darauf hin, dass die Vorschläge nicht deterministisch sind; überprüfen Sie daher jede Zeile vor der Ausführung.

Ordnen Sie die Spaltenindizes anstatt der Zeilenindizes neu an. `df[, order(names(df))]` sortiert die Spalten alphabetisch, und `df[, c(“c3”, “c1”)]` legt eine explizite Reihenfolge fest. dplyr-Benutzer können `select(df, c3, c1)` aufrufen, um die Spalten in einem Schritt neu zu sortieren und Teilmengen zu erstellen.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: