webentwicklung-frage-antwort-db.com.de

Sortieren Sie die Spalten eines Datenrahmens nach dem Spaltennamen

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

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 alphabetisch nach Spaltennamen zu ordnen, um 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 automatisiert werden.

61
John Clark

Sie können order für names verwenden und damit die Spalten beim Subsetting anordnen:

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 Bestellung müssen Sie Ihre eigene Zuordnung der Namen zur Bestellung definieren. Dies hängt davon ab, wie Sie dies tun möchten, aber wenn Sie die oben beschriebene Funktion mit order austauschen, sollte die gewünschte Ausgabe erzielt werden.

Sie können sich beispielsweise Reihenfolge der Zeilen eines Datenrahmens gemäß einem Zielvektor ansehen, der die gewünschte Reihenfolge angibt, dh, Sie können match Ihren Datenrahmen names gegen einen Zielvektor mit dem gewünschte Spaltenreihenfolge.

98
James
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 ein Ersatz 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")]
13
MANOJ KUMAR

Hier ist die obligatorische dplyr-Antwort für den Fall, dass jemand dies mit der Pipe tun möchte.

test %>% 
    select(sort(names(.)))
5
Andrew Brēza
  test[,sort(names(test))]

sortieren nach Namen von Spalten kann problemlos funktionieren.

2

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

require(dplyr)
test %>%
  select(B, everything())
0
Xavier Jiménez

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

Tun Sie zuerst das, was James oben erwähnt hat, d.h.

test[ , order(names(test))]

Zweitens verwenden Sie die Funktion everything () in dplyr, um bestimmte interessierende Spalten (z. B. "D", "G", "K") am Anfang des Datenrahmens zu verschieben, wobei die alphabetisch geordneten Spalten hinter diesen Spalten stehen. 

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

Das

0
Brit

Eine andere Möglichkeit besteht darin, str_sort() aus der Bibliothek stringr mit dem Argument numeric = TRUE zu verwenden.

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

# [1] V1 V3 V11

0
demarsylvain

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

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

Damit zuerst eine bestimmte Spalte und dann der Rest in alphabetischer Reihenfolge angezeigt wird, würde ich die folgende Lösung vorschlagen:

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