393 Stimmen

Wie kann man Spalten in einem Datenrahmen neu anordnen?

Wie würde man diese Eingabe ändern (in der Reihenfolge: Zeit, Eingang, Ausgang, Dateien):

Time   In    Out  Files
1      2     3    4
2      3     4    5

Zu dieser Ausgabe (in der Reihenfolge: time, out, in, files)?

Time   Out   In  Files
1      3     2    4
2      4     3    5

Hier sind die Dummy-R-Daten:

table <- data.frame(Time=c(1,2), In=c(2,3), Out=c(3,4), Files=c(4,5))
table
##  Time In Out Files
##1    1  2   3     4
##2    2  3   4     5

43voto

Ritchie Sacramento Punkte 22572

dplyr Version 1.0.0 umfasst die relocate() Funktion, um Spalten einfach neu anzuordnen:

dat <- data.frame(Time=c(1,2), In=c(2,3), Out=c(3,4), Files=c(4,5))

library(dplyr) # from version 1.0.0 only

dat %>%
  relocate(Out, .before = In)

oder

dat %>%
  relocate(Out, .after = Time)

27voto

user3482899 Punkte 320

Vielleicht ist es ein Zufall, dass die von Ihnen gewünschte Spaltenreihenfolge zufällig Spaltennamen in absteigender alphabetischer Reihenfolge enthält. Da dies der Fall ist, könnten Sie einfach tun:

df<-df[,order(colnames(df),decreasing=TRUE)]

Das verwende ich, wenn ich große Dateien mit vielen Spalten habe.

21voto

usct01 Punkte 788

Sie können die Daten.Tabelle Paket:

Wie man die Spalten der data.table neu anordnet (ohne Kopieren)

require(data.table)
setcolorder(DT,myOrder)

19voto

Vrokipal Punkte 704

En drei top-bewertet antwortet haben eine Schwäche.

Wenn Ihr Datenrahmen wie folgt aussieht

df <- data.frame(Time=c(1,2), In=c(2,3), Out=c(3,4), Files=c(4,5))

> df
  Time In Out Files
1    1  2   3     4
2    2  3   4     5

dann ist es eine schlechte Lösung, die

> df2[,c(1,3,2,4)]

Es funktioniert, aber Sie haben gerade eine Abhängigkeit von der Reihenfolge der Spalten in Ihrer Eingabe eingeführt.

Diese Art der spröden Programmierung ist zu vermeiden.

Die explizite Benennung der Spalten ist eine bessere Lösung

data[,c("Time", "Out", "In", "Files")]

Und wenn Sie Ihren Code in einem allgemeineren Rahmen wiederverwenden wollen, können Sie einfach

out.column.name <- "Out"
in.column.name <- "In"
data[,c("Time", out.column.name, in.column.name, "Files")]

was auch ganz nett ist, weil es Literale vollständig isoliert. Im Gegensatz dazu, wenn Sie dplyr's select

data <- data %>% select(Time, out, In, Files)

dann würden Sie diejenigen, die Ihren Code später lesen, ein wenig in die Irre führen, auch sich selbst. Die Spaltennamen werden als Literale verwendet, ohne im Code als solche zu erscheinen.

3voto

Hossein Noorazar Punkte 105
data.table::setcolorder(table, c("Out", "in", "files"))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X