webentwicklung-frage-antwort-db.com.de

Benennen Sie mehrere Dataframe-Spalten um, auf die durch aktuelle Namen verwiesen wird

Ich möchte einige zufällige Spalten eines large -Datenrahmens umbenennen und die aktuellen Spaltennamen verwenden, nicht die Indizes. Spaltenindizes können sich ändern, wenn ich zu den Daten Spalten hinzufüge oder entferne. Daher stelle ich fest, dass die vorhandenen Spaltennamen eine stabilere Lösung sind.

mydf = merge(df.1, df.2)
colnames(mydf)[which(colnames(mydf) == "MyName.1")] = "MyNewName"

Kann ich diesen Code vereinfachen, entweder den ursprünglichen Aufruf merge() oder nur die zweite Zeile? "MyName.1" ist eigentlich das Ergebnis eines xts merge von zwei verschiedenen xts-Objekten.

36
Robert Kubrick
names(mydf)[names(mydf) == "MyName.1"] = "MyNewName" # 13 characters shorter. 

Obwohl Sie einen Vektor eventuell ersetzen möchten. In diesem Fall verwenden Sie %in% anstelle von == und setzen Sie MyName.1 als gleich langen Vektor auf MyNewName

25

Das Problem bei der Änderung der Spaltennamen eines data.frame besteht darin, dass der gesamte data.frame fast unglaublich kopiert wird. Auch wenn es sich in .GlobalEnv befindet und keine andere Variable darauf verweist.

Das data.table-Paket verfügt über eine setnames()-Funktion, die die Spaltennamen anhand der Referenz ändert, ohne das gesamte Dataset zu kopieren. data.table unterscheidet sich dadurch, dass es nicht beim Schreiben kopiert wird, was für große Datensätze sehr wichtig sein kann. (Sie sagten, dass Ihr Datensatz groß war.). Geben Sie einfach die old- und die new-Namen an:

require(data.table)
setnames(DT,"MyName.1", "MyNewName")
# or more explicit:
setnames(DT, old = "MyName.1", new = "MyNewName")
?setnames
135
Matt Dowle

plyr hat zu diesem Zweck eine Umbenennungsfunktion:

library(plyr)
mydf <- rename(mydf, c("MyName.1" = "MyNewName"))
25
hadley
names(mydf) <- sub("MyName\\.1", "MyNewName", names(mydf))

Dies würde besser zu einer Strategie zur Änderung mehrerer Namen führen, wenn Sie einen Stamm als Muster verwenden, das durch gsub anstelle von sub ersetzt werden soll.

4
42-

Sie können die str_replace-Funktion des Pakets stringr verwenden:

names(mydf) <- str_replace(names(mydf), "MyName.1", "MyNewName")
0
tfad334