Verschieben Sie eine Spalte an die erste Position in einem Datenrahmen

77

Ich möchte, dass die letzte Spalte des Datenrahmens an den Anfang verschoben wird (als erste Spalte). Wie kann ich das in R machen?

Mein data.frame hat ungefähr tausend Spalten, um die Reihenfolge zu ändern. Ich möchte nur eine Spalte auswählen und "an den Anfang verschieben".

ECII
quelle

Antworten:

22

Ich weiß nicht, ob es sich lohnt, dies als Antwort hinzuzufügen oder ob ein Kommentar in Ordnung wäre, aber ich habe eine Funktion namens geschrieben moveme, mit der Sie mit der von Ihnen beschriebenen Sprache tun können, was Sie wollen. Sie finden die Funktion unter folgender Antwort: https://stackoverflow.com/a/18540144/1270695

Es funktioniert auf namesIhrem data.frameund erzeugt einen Zeichenvektor, mit dem Sie Ihre Spalten neu anordnen können:

mydf <- data.frame(matrix(1:12, ncol = 4))
mydf
moveme(names(mydf), "X4 first")
# [1] "X4" "X1" "X2" "X3"
moveme(names(mydf), "X4 first; X1 last")
# [1] "X4" "X2" "X3" "X1"

mydf[moveme(names(mydf), "X4 first")]
#   X4 X1 X2 X3
# 1 10  1  4  7
# 2 11  2  5  8
# 3 12  3  6  9

Wenn Sie solche Dinge durcheinander bringen, schlage ich vor, Ihre data.framein a umzuwandeln data.tableund setcolorder(mit meiner movemeFunktion, wenn Sie möchten) die Änderung anhand der Referenz vorzunehmen.


In Ihrer Frage haben Sie auch erwähnt "Ich möchte nur eine Spalte auswählen und an den Anfang verschieben". Wenn es sich um eine beliebige Spalte handelt und nicht speziell um die letzte, können Sie auch die Verwendung in Betracht ziehen setdiff.

Stellen Sie sich vor, Sie arbeiten mit dem Datensatz "mtcars" und möchten die Spalte "am" an den Anfang verschieben.

x <- "am"
mtcars[c(x, setdiff(names(mtcars), x))]
A5C1D2H2I1M1N2O1R2T1
quelle
184

Dplyrs select () -Ansatz

Verschieben der letzten Spalte an den Anfang:

new_df <- df %>%
  select(last_column_name, everything())

Dies gilt auch für jede Spalte und jede Menge:

new_df <- df %>%
  select(col_5, col_8, everything())

Beispiel mit mtcarsDatenrahmen:

head(mtcars, n = 2)
#                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4

# Last column is 'carb'
new_df <- mtcars %>% select(carb, everything())

head(new_df, n = 2)
#                   carb  mpg cyl disp  hp drat    wt  qsec vs am gear
# Mazda RX4            4 21.0   6  160 110 3.90 2.620 16.46  0  1    4
# Mazda RX4 Wag        4 21.0   6  160 110 3.90 2.875 17.02  0  1    4
marc_aragones
quelle
35

Sie können die Reihenfolge der Spalten ändern, indem Sie sie in der neuen Reihenfolge adressieren, indem Sie sie explizit mit auswählen data[,c(ORDER YOU WANT THEM TO BE IN)]

Wenn Sie nur möchten, dass die letzte Spalte zuerst verwendet wird: data[,c(ncol(data),1:(ncol(data)-1))]

> head(cars)
  speed dist
1     4    2
2     4   10
3     7    4
4     7   22
5     8   16
6     9   10

> head(cars[,c(2,1)])
  dist speed
1    2     4
2   10     4
3    4     7
4   22     7
5   16     8
6   10     9
Rentrop
quelle
Vielen Dank, dies wird das Chaos im gesamten
Datenrahmen zerstören
8
dann benutzen Sie einfachdata[,c(ncol(data),1:(ncol(data)-1))]
Rentrop
genau das, wonach ich gesucht habe. Ich musste die letzten 8 Spalten am Anfang der anderen 33 Spalten verschieben und habe sie verwendet. Ausdruck <- Ausdruck1 [, c (33: 40,1: (32))] Danke!
Urvah Shabbir
26
dataframe<-dataframe[,c(1000, 1:999)]

Dadurch wird Ihre letzte Spalte, dh die 1000. Spalte, in die erste Spalte verschoben.

Neuling
quelle
19

Wenn Sie eine benannte Spalte an die erste Position verschieben möchten, verwenden Sie einfach:

df[,c(which(colnames(df)=="desired_colname"),which(colnames(df)!="desired_colname"))]
HT_079
quelle
2
Dies ist leicht die beste Antwort hier
Neal Barsch
1
Dies scheint nicht zu funktionieren, wenn die benannte Spalte ein geordneter Faktor ist.
DLyons
10

dplyr 1.0.0Enthält jetzt die relocate()Funktion zum Neuordnen von Spalten. Das Standardverhalten besteht darin, die benannten Spalten an die erste Position zu verschieben.

library(dplyr) # from version 1.0.0 

mtcars %>%
  relocate(carb) %>%
  head()

                  carb  mpg cyl disp  hp drat    wt  qsec vs am gear
Mazda RX4            4 21.0   6  160 110 3.90 2.620 16.46  0  1    4
Mazda RX4 Wag        4 21.0   6  160 110 3.90 2.875 17.02  0  1    4
Datsun 710           1 22.8   4  108  93 3.85 2.320 18.61  1  1    4
Hornet 4 Drive       1 21.4   6  258 110 3.08 3.215 19.44  1  0    3
Hornet Sportabout    2 18.7   8  360 175 3.15 3.440 17.02  0  0    3
Valiant              1 18.1   6  225 105 2.76 3.460 20.22  1  0    3

Andere Speicherorte können jedoch mit den Argumenten .beforeoder angegeben werden .after:

mtcars %>%
  relocate(gear, carb, .before = cyl) %>%
  head()

                   mpg gear carb cyl disp  hp drat    wt  qsec vs am
Mazda RX4         21.0    4    4   6  160 110 3.90 2.620 16.46  0  1
Mazda RX4 Wag     21.0    4    4   6  160 110 3.90 2.875 17.02  0  1
Datsun 710        22.8    4    1   4  108  93 3.85 2.320 18.61  1  1
Hornet 4 Drive    21.4    3    1   6  258 110 3.08 3.215 19.44  1  0
Hornet Sportabout 18.7    3    2   8  360 175 3.15 3.440 17.02  0  0
Valiant           18.1    3    1   6  225 105 2.76 3.460 20.22  1  0
27 ϕ 9
quelle
4

Ein nativer R-Ansatz, der mit einer beliebigen Anzahl von Zeilen oder Spalten arbeitet, um die letzte Spalte eines Datenrahmens an die erste Spaltenposition zu verschieben:

df <- df[,c(ncol(df),1:ncol(df)-1)]

Es kann verwendet werden, um eine beliebige Spalte in die erste Spalte zu verschieben, indem Folgendes ersetzt wird:

df <- df[,c(your_column_number_here,1:ncol(df)-1)]

Wenn Sie die Spaltennummer nicht kennen, aber den Namen der Spaltenbezeichnung kennen, ersetzen Sie "your_column_name_here" wie folgt:

columnNumber <- which(colnames(df)=="your_column_name_here")
df <- df[,c(columnNumber,1:ncol(df)-1)]
Brapplecache
quelle
1

Verschieben Sie eine beliebige Spalte von einer beliebigen Position zur ersten Position in Ihren Daten

n <- which(colnames(df)=="column_need_move")
column_need_move <- df$column_need_to_move
df <- cbind(column_need_move, df[,-n])
Irina Max
quelle