it-swarm.com.de

Ist es möglich, Spalten in einem Datenrahmen mit R auszutauschen?

Ich habe drei Variablen in einem Datenrahmen und möchte die 4 Spalten von herum tauschen

"dam"   "piglet"   "fdate"   "ssire"

zu

"piglet"   "ssire"   "dam"   "tdate"

Kann ich mit R tauschen?

Jede Hilfe wäre sehr dankbar.

Baz

18
baz
dfrm <- dfrm[c("piglet", "ssire", "dam", "tdate")]

ODER:

dfrm <- dfrm[ , c("piglet", "ssire", "dam", "tdate")]
31
42-
d <- data.frame(a=1:3, b=11:13, c=21:23)
d
#  a  b  c
#1 1 11 21
#2 2 12 22
#3 3 13 23
d2 <- d[,c("b", "c", "a")]
d2
#   b  c a
#1 11 21 1
#2 12 22 2
#3 13 23 3

oder Sie können dasselbe mit dem Index tun:

d3 <- d[,c(2, 3, 1)]
d3
#   b  c a
#1 11 21 1
#2 12 22 2
#3 13 23 3
13
kohske

Um die anderen Beiträge zusammenzufassen, gibt es drei Möglichkeiten, die Spaltenreihenfolge zu ändern, und zwei Möglichkeiten, die Indizierung in jeder Methode anzugeben.

Gegeben ein Beispieldatenrahmen

dfr <- data.frame(
  dam    = 1:5,
  piglet = runif(5),
  fdate  = letters[1:5],
  ssire  = rnorm(5)
)

Kohskes Antwort: Sie können die standardmäßige matrixähnliche Indizierung mit Spaltennummern verwenden

dfr[, c(2, 4, 1, 3)]

oder mit Spaltennamen

dfr[, c("piglet", "ssire", "dam", "fdate")]

Antwort von DWin & Gavin: Mit Datenrahmen können Sie das Zeilenargument bei der Angabe des Indexes weglassen.

dfr[c(2, 4, 1, 3)]
dfr[c("piglet", "ssire", "dam", "fdate")]

Antwort von Paul Hurleyuk: Sie können auch subset verwenden.

subset(dfr, select = c(2, 4, 1, 3))
subset(dfr, select = c(c("piglet", "ssire", "dam", "fdate")))
8
Richie Cotton

Sie können das 'select'-Argument der Untermenge verwenden.

#Assume df contains "dam" "piglet" "fdate" "ssire"

newdf<-subset(df, select=c("piglet", "ssire", "dam", "tdate"))
5
PaulHurleyuk

Mir ist aufgefallen, dass dies eine fast 8 Jahre alte Frage ist. Aber für Leute, die anfangen R zu lernen und wie ich über diese Frage stolpern könnten, können Sie jetzt eine sehr flexible select() -Funktion aus dem dplyr -Paket verwenden, um die Swap-Operation wie folgt durchzuführen .

# Install and load the dplyr package
install.packages("dplyr")
library("dplyr")

# Override the existing data frame with the desired column order
df <- select(df, piglet, ssire, dam, tdate)

Dieser Ansatz hat folgende Vorteile:

  1. Sie müssen weniger eingeben, da für select() keine Variablennamen in Anführungszeichen gesetzt werden müssen.
  2. Wenn Ihr Datenrahmen mehr als 4 Variablen enthält, können Sie Hilfsfunktionen wie starts_with(), ends_with() usw. verwenden, um mehrere Spalten auszuwählen, ohne jede Spalte benennen und neu anordnen zu müssen mit viel Leichtigkeit.
2
Ashirwad

Ich habe schnell eine Funktion geschrieben, die einen Vektor v und Spaltenindizes a und b übernimmt, die Sie austauschen möchten. 

swappy = function(v,a,b){  # where v is a dataframe, a and b are the 
columns indexes to swap

name = deparse(substitute(v))

helpy = v[,a]
v[,a] = v[,b]
v[,b] = helpy


name1 = colnames(v)[a] 
name2 = colnames(v)[b] 

colnames(v)[a] = name2
colnames(v)[b] = name1

assign(name,value = v , envir =.GlobalEnv)
}
0
Peter Dieter