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

414voto

richiemorrisroe Punkte 9071

Ihr Datenrahmen hat vier Spalten wie folgt df[,c(1,2,3,4)] . Beachten Sie, dass das erste Komma bedeutet, dass alle Zeilen beibehalten werden, und dass sich 1,2,3,4 auf die Spalten bezieht.

Um die Reihenfolge wie in der obigen Frage zu ändern, gehen Sie wie folgt vor df2[,c(1,3,2,4)]

Wenn Sie diese Datei als csv-Datei ausgeben möchten, gehen Sie wie folgt vor write.csv(df2, file="somedf.csv")

214voto

Xavier Guardiola Punkte 2559
# reorder by column name
data <- data[, c("A", "B", "C")] # leave the row index blank to keep all rows

#reorder by column index
data <- data[, c(1,3,2)] # leave the row index blank to keep all rows

124voto

dalloliogm Punkte 8247

Sie können auch die Teilmengenfunktion verwenden:

data <- subset(data, select=c(3,2,1))

Sie sollten besser den []-Operator wie in den anderen Antworten verwenden, aber es kann nützlich sein, zu wissen, dass Sie eine Teilmenge und eine Spaltenumordnung in einem einzigen Befehl durchführen können.

Aktualisierung:

Sie können auch die Funktion select aus dem Paket dplyr verwenden:

data = data %>% select(Time, out, In, Files)

Ich bin mir über die Effizienz nicht sicher, aber dank der Syntax von dplyr sollte diese Lösung flexibler sein, besonders wenn Sie viele Spalten haben. Das folgende Beispiel ordnet die Spalten des mtcars-Datensatzes in umgekehrter Reihenfolge neu an:

mtcars %>% select(carb:mpg)

Im Folgenden werden nur einige Spalten neu geordnet, andere werden verworfen:

mtcars %>% select(mpg:disp, hp, wt, gear:qsec, starts_with('carb'))

Lesen Sie mehr über Die Select-Syntax von dplyr .

51voto

landroni Punkte 2784

Wie bereits in dieser Kommentar die Standardvorschläge für die Neuanordnung von Spalten in einer data.frame sind im Allgemeinen umständlich und fehleranfällig, vor allem, wenn Sie viele Spalten haben.

Mit dieser Funktion können Sie Spalten nach Position neu anordnen: Geben Sie einen Variablennamen und die gewünschte Position an, und kümmern Sie sich nicht um die anderen Spalten.

##arrange df vars by position
##'vars' must be a named vector, e.g. c("var.name"=1)
arrange.vars <- function(data, vars){
    ##stop if not a data.frame (but should work for matrices as well)
    stopifnot(is.data.frame(data))

    ##sort out inputs
    data.nms <- names(data)
    var.nr <- length(data.nms)
    var.nms <- names(vars)
    var.pos <- vars
    ##sanity checks
    stopifnot( !any(duplicated(var.nms)), 
               !any(duplicated(var.pos)) )
    stopifnot( is.character(var.nms), 
               is.numeric(var.pos) )
    stopifnot( all(var.nms %in% data.nms) )
    stopifnot( all(var.pos > 0), 
               all(var.pos <= var.nr) )

    ##prepare output
    out.vec <- character(var.nr)
    out.vec[var.pos] <- var.nms
    out.vec[-var.pos] <- data.nms[ !(data.nms %in% var.nms) ]
    stopifnot( length(out.vec)==var.nr )

    ##re-arrange vars by position
    data <- data[ , out.vec]
    return(data)
}

Jetzt wird die Anfrage des Auftraggebers ganz einfach:

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

arrange.vars(table, c("Out"=2))
##  Time Out In Files
##1    1   3  2     4
##2    2   4  3     5

Um zusätzlich zu tauschen Time y Files Spalten können Sie dies tun:

arrange.vars(table, c("Out"=2, "Files"=1, "Time"=4))
##  Files Out In Time
##1     4   3  2    1
##2     5   4  3    2

43voto

Ben G Punkte 3724

A dplyr Lösung (Teil des tidyverse Paketsatz) ist die Verwendung von select :

select(table, "Time", "Out", "In", "Files") 

# or

select(table, Time, 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