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.

John Clark
quelle

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.

James
quelle
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(.)))
Andrew Brēza
quelle
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")]
MANOJ KUMAR
quelle
6
  test[,sort(names(test))]

Das Sortieren nach Spaltennamen kann problemlos funktionieren.

Shalini Baranwal
quelle
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())
Xavier Jiménez Albán
quelle
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")))]
Tom Wagstaff
quelle
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

demarsylvain
quelle
1

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

sort(colnames(test[1:ncol(test)] ))
KNN
quelle
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())

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

Brit
quelle