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

3voto

Pau Punkte 41

Dplyr hat eine Funktion, mit der Sie bestimmte Spalten vor oder nach anderen Spalten verschieben können. Das ist ein wichtiges Werkzeug, wenn Sie mit großen Daten-Frameworks arbeiten (wenn es 4 Spalten sind, ist es schneller, wenn Sie Wählen Sie wie bereits erwähnt).

https://dplyr.tidyverse.org/reference/relocate.html

In Ihrem Fall wäre dies der Fall:

df <- df %>% relocate(Out, .after = In)

Einfach und elegant. Es erlaubt Ihnen auch, mehrere Spalten zusammen zu verschieben und an den Anfang oder ans Ende zu setzen:

df <- df %>% relocate(any_of(c('ColX', 'ColY', 'ColZ')), .after = last_col())

Nochmals: super leistungsstark, wenn Sie mit großen Datenrahmen arbeiten :)

1voto

Cybernetic Punkte 10978

Die einzige, die ich für gut befunden habe, ist die von aquí .

 shuffle_columns <- function (invec, movecommand) {
      movecommand <- lapply(strsplit(strsplit(movecommand, ";")[[1]],
                                 ",|\\s+"), function(x) x[x != ""])
  movelist <- lapply(movecommand, function(x) {
    Where <- x[which(x %in% c("before", "after", "first",
                              "last")):length(x)]
    ToMove <- setdiff(x, Where)
    list(ToMove, Where)
  })
  myVec <- invec
  for (i in seq_along(movelist)) {
    temp <- setdiff(myVec, movelist[[i]][[1]])
    A <- movelist[[i]][[2]][1]
    if (A %in% c("before", "after")) {
      ba <- movelist[[i]][[2]][2]
      if (A == "before") {
        after <- match(ba, temp) - 1
      }
      else if (A == "after") {
        after <- match(ba, temp)
      }
    }
    else if (A == "first") {
      after <- 0
    }
    else if (A == "last") {
      after <- length(myVec)
    }
    myVec <- append(temp, values = movelist[[i]][[1]], after = after)
  }
  myVec
}

So verwenden:

new_df <- iris[shuffle_columns(names(iris), "Sepal.Width before Sepal.Length")]

Funktioniert wie ein Zauber.

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