Sortieren Sie die Spalten eines Datenrahmens nach dem Spaltennamen


90

Dies ist möglicherweise eine einfache Frage, aber ich weiß nicht, wie ich Spalten alphabetisch sortieren soll.

test = data.frame(C = c(0, 2, 4, 7, 8), A = c(4, 2, 4, 7, 8), B = c(1, 3, 8, 3, 2))

#   C A B
# 1 0 4 1
# 2 2 2 3
# 3 4 4 8
# 4 7 7 3
# 5 8 8 2

Ich mag es, die Spalten nach Spaltennamen alphabetisch zu ordnen, um dies zu erreichen

#   A B C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

Für andere möchte ich meine eigene definierte Reihenfolge:

#   B A C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

Bitte beachten Sie, dass meine Datensätze mit 10000 Variablen sehr groß sind. Daher muss der Prozess stärker automatisiert werden.

Antworten:


133

Sie können orderauf namesund verwenden, um die Spalten bei der Teilmenge zu ordnen:

test[ , order(names(test))]
  A B C
1 4 1 0
2 2 3 2
3 4 8 4
4 7 3 7
5 8 2 8

Für Ihre eigene definierte Reihenfolge müssen Sie Ihre eigene Zuordnung der Namen zur Bestellung definieren. Dies hängt davon ab, wie Sie dies tun möchten. Wenn Sie jedoch eine der oben genannten Funktionen austauschen order, erhalten Sie die gewünschte Ausgabe.

Sie können beispielsweise einen Blick auf die Reihenfolge der Zeilen eines Datenrahmens nach einem Zielvektor werfen , der die gewünschte Reihenfolge angibt , dh Sie können matchIhren Datenrahmen anhand nameseines Zielvektors vergleichen, der die gewünschte Spaltenreihenfolge enthält.


3
Um dies zu erläutern, wird durch Testen von [, c (2,3,1)] oder Test [, c ('A', 'B', 'C')] die Spaltenreihenfolge A, B, C erzeugt. Der Operator "[" ist sehr geschickt darin, herauszufinden, was Sie tun möchten.
Carl Witthoft

2
danke, ich habe die zweite Frage mit Hilfe herausgefunden; myorder = c ("B", "A", "C"), test [, myorder]
John Clark

Gibt es eine Möglichkeit, die Spalten so zu sortieren, wie ich es möchte (z. B. CAB)?
TYZ

Sie können die Tatsache ausnutzen, dass ein data.frame eine Liste ist und es einfacher machen :: test[ order(names(test)) ]
ctbrown

1
@naco Keine, lesen Sie die Quelle von colnames: Am Ende wird namesnach a gerufen data.frame.
James

25

Hier ist die obligatorische dplyrAntwort für den Fall, dass jemand dies mit der Pfeife tun möchte.

test %>% 
    select(sort(names(.)))

4
Für mich hat das gut funktioniert, da es einfach ist, zuerst die gewünschten Variablen auszuwählen. Festhalten am ursprünglichen df: test%>%select(b,sort(names(.)))wird es als "b, a, c" setzen
Silentdevildoll

@ Silentdevildoll das ist eine coole Anwendung! Daran habe ich nicht gedacht.
Andrew Brēza

14
test = data.frame(C=c(0,2,4, 7, 8), A=c(4,2,4, 7, 8), B=c(1, 3, 8,3,2))

Mit der folgenden einfachen Funktion kann das Ersetzen durchgeführt werden (jedoch nur, wenn der Datenrahmen nicht viele Spalten enthält):

test <- test[, c("A", "B", "C")]

für andere:

test <- test[, c("B", "A", "C")]


4

Wenn Sie nur eine oder mehrere Spalten vorne haben möchten und sich nicht um die Reihenfolge der anderen kümmern möchten:

require(dplyr)
test %>%
  select(B, everything())

2

Damit zuerst eine bestimmte Spalte und dann der Rest alphabetisch angezeigt wird, würde ich diese Lösung vorschlagen:

test[, c("myFirstColumn", sort(setdiff(names(test), "myFirstColumn")))]

und wenn Sie möchten, dass mehr als eine Spalte an erster Stelle steht, was dann?
Maksym Moroz

2

Eine alternative Option ist die Verwendung str_sort()aus der Bibliothek stringr mit dem Argument numeric = TRUE. Dadurch wird die Spalte korrekt sortiert, die Zahlen nicht nur alphabetisch enthält :

str_sort(c("V3", "V1", "V10"), numeric = TRUE)

# [1] V1 V3 V11


1

Ähnlich wie bei der obigen Syntax, aber zum Lernen - können Sie nach Spaltennamen sortieren?

sort(colnames(test[1:ncol(test)] ))

Das [1:ncol(test)]macht hier nichts, es ist nur eine längere Art zu schreiben sort(colnames(test)).
Gregor Thomas

0

Folgendes habe ich herausgefunden, um ein ähnliches Problem mit meinem Datensatz zu erreichen.

Tun Sie zuerst das, was James oben erwähnt hat, dh

test[ , order(names(test))]

Verwenden Sie zweitens die Funktion every () in dplyr, um bestimmte interessierende Spalten (z. B. "D", "G", "K") am Anfang des Datenrahmens zu verschieben und die alphabetisch geordneten Spalten nach diesen zu setzen.

select(test, D, G, K, everything())

­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.