487 Stimmen

Ändern von Spaltennamen in einem Datenrahmen

Ich habe einen Datenrahmen namens "newprice" (siehe unten) und möchte die Spaltennamen in meinem Programm in R ändern.

> newprice
   Chang.  Chang.   Chang.
1     100       36      136
2     120      -33       87
3     150       14      164

Das ist es, was ich tue:

names(newprice)[1]<-paste("premium")
names(newprice)[2]<-paste("change")
names(newprice)[3]<-paste("newprice") 

Ich habe dies nicht in eine Schleife gestellt, weil ich möchte, dass jeder Spaltenname anders ist, wie Sie sehen.

Wenn ich mein Programm in die R-Konsole einfüge, ist dies die Ausgabe, die ich erhalte:

> names(newprice)[1]<-paste(“premium”)
Error: unexpected input in "names(newprice)[1]<-paste(“"
> names(newprice)[2]<-paste(“change”)
Error: unexpected input in "names(newprice)[2]<-paste(“"
> names(newprice)[3]<-paste(“newpremium”)
Error: unexpected input in "names(newprice)[3]<-paste(“"

Ich habe ebenfalls versucht, die c() Funktion - zum Beispiel c("premium") anstelle der paste() Funktion, aber ohne Erfolg.

Kann mir jemand helfen, das herauszufinden?

13voto

sbha Punkte 8288

Es gibt eine Reihe von Optionen mit dplyr::rename() y dplyr::select() :

library(dplyr)

mtcars %>% 
  tibble::rownames_to_column('car_model') %>%                            # convert rowname to a column. tibble must be installed.
  select(car_model, est_mpg = mpg, horse_power = hp, everything()) %>%   # rename specific columns and reorder
  rename(weight = wt, cylinders = cyl) %>%                               # another option for renaming specific columns that keeps everything by default
  head(2)
      car_model est_mpg horse_power cylinders disp drat weight  qsec vs am gear carb
1     Mazda RX4      21         110         6  160  3.9  2.620 16.46  0  1    4    4
2 Mazda RX4 Wag      21         110         6  160  3.9  2.875 17.02  0  1    4    4

Darüber hinaus gibt es drei Varianten von scoped dplyr::rename() : dplyr::rename_all() für alle Spaltennamen, dplyr::rename_if() für die bedingte Ausrichtung von Spaltennamen und dplyr::rename_at() für die Auswahl benannter Spalten. Im folgenden Beispiel werden Leerzeichen und Punkte durch einen Unterstrich ersetzt und alles in Kleinbuchstaben umgewandelt:

iris %>%  
  rename_all(~gsub("\\s+|\\.", "_", .)) %>% 
  rename_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

dplyr::select_all() kann ebenfalls in ähnlicher Weise verwendet werden:

iris %>%  
  select_all(~gsub("\\s+|\\.", "_", .)) %>% 
  select_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

10voto

ngamita Punkte 329

Versuchen:

names(newprice) <- c("premium", "change", "newprice")

10voto

jangorecki Punkte 15157

Ich möchte nur die Antwort von Scott Wilson korrigieren und etwas erweitern.
Sie können die data.table-Funktion setnames Funktion auch auf data.frames anwenden.

Erwarten Sie keine Beschleunigung des Vorgangs, aber Sie können erwarten, dass die setnames ist im Hinblick auf den Speicherverbrauch effizienter, da es die Spaltennamen per Verweis aktualisiert. Dies kann verfolgt werden mit address Funktion, siehe unten.

library(data.table)
set.seed(123)
n = 1e8

df = data.frame(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(df)
#[1] "0x208f9f00"
colnames(df) <- c("good", "better")
address(df)
#[1] "0x208fa1d8"
rm(df)

dt = data.table(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(dt)
#[1] "0x535c830"
setnames(dt, c("good", "better"))
address(dt)
#[1] "0x535c830"
rm(dt)

Wenn Sie also an die Grenzen Ihres Speichers stoßen, sollten Sie stattdessen dieses Programm verwenden.

8voto

Baykal Punkte 507

Sie können die Bearbeitung einfach selbst vornehmen:

newprice <- edit(newprice)

und ändern Sie den Spaltennamen manuell.

3voto

Chris Punkte 1109

Dies kann hilfreich sein:

rename.columns=function(df,changelist){
  #renames columns of a dataframe
  for(i in 1:length(names(df))){
    if(length(changelist[[names(df)[i]]])>0){
      names(df)[i]= changelist[[names(df)[i]]]
    }
  }
  df
}

# Specify new dataframe
df=rename.columns(df,list(old.column='new.column.name'))

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