web-dev-qa-db-de.com

Spaltennamen eines Datenrahmens ändern

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

In der Tat mache ich das:

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

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

Wenn ich mein Programm in die R-Konsole einfüge, bekomme ich folgende Ausgabe:

> 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 auch versucht, die Funktion c() zu verwenden, beispielsweise c("premium"), anstelle der paste()-Funktion, aber ohne Erfolg.

Könnte mir jemand helfen, das herauszufinden?

327
Son

Verwenden Sie die Funktion colnames():

R> X <- data.frame(bad=1:3, worse=rnorm(3))
R> X
  bad     worse
1   1 -2.440467
2   2  1.320113
3   3 -0.306639
R> colnames(X) <- c("good", "better")
R> X
  good    better
1    1 -2.440467
2    2  1.320113
3    3 -0.306639

Sie können auch eine Untergruppe erstellen:

R> colnames(X)[2] <- "superduper"
513

Ich benutze das:

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
137
Matheus Abreu

Der Fehler wird durch die "intelligenten Anführungszeichen" (oder wie auch immer sie genannt werden) verursacht. Die Lektion hier lautet: "Schreiben Sie Ihren Code nicht in einen Editor, der Zitate in intelligente Anführungszeichen umwandelt".

names(newprice)[1]<-paste(“premium”)  # error
names(newprice)[1]<-paste("premium")  # works

Außerdem brauchen Sie paste("premium") nicht (der Aufruf von paste ist redundant), und es ist eine gute Idee, Leerzeichen um <- zu setzen, um Verwirrung zu vermeiden (z. B. x <- -10; if(x<-3) "hi" else "bye"; x).

71
Joshua Ulrich

Hast du gerade versucht:

names(newprice)[1]<-"premium"

?

43
Jamie

Die neue empfohlene Methode hierfür ist die Verwendung der Funktion setNames. Siehe ?setNames. Da dies eine neue Kopie von data.frame erstellt, müssen Sie das Ergebnis dem ursprünglichen data.frame zuordnen, falls dies Ihre Absicht ist.

data_frame <- setNames(data_frame, c("premium","change","newprice"))

Neuere Versionen von R geben eine Warnung aus, wenn Sie colnames auf einige der in früheren Antworten vorgeschlagenen Methoden verwenden.

Wenn dies stattdessen ein data.table wäre, können Sie die data.table-Funktion setnames verwenden, die bestimmte Spaltennamen oder einen einzelnen Spaltennamen anhand der Referenz ändern kann:

setnames(data_table, "old-name", "new-name")
33
Scott C Wilson

Ich hatte das gleiche Problem und dieses Stück Code hat für mich geklappt.

names(data)[names(data) == "oldVariableName"] <- "newVariableName"

Kurz gesagt führt dieser Code Folgendes aus:

names(data) prüft alle Namen im Datenrahmen (data)

[names(data) == oldVariableName] extrahiert den Variablennamen (oldVariableName), den Sie umbenennen möchten, und <- "newVariableName" weist den neuen Variablennamen zu.

Ähnlich wie die anderen:

cols <- c("premium","change","newprice")
colnames(dataframe) <- cols

Ganz einfach und leicht zu ändern.

15
Adam Erickson

Wenn Sie nicht alle, sondern mehrere Spalten gleichzeitig umbenennen möchten und nur die alten Spaltennamen kennen, können Sie die colnames-Funktion und den %in%-Operator verwenden. Beispiel:

df = data.frame(bad=1:3, worse=rnorm(3), worst=LETTERS[1:3])

   bad      worse    worst
1   1 -0.77915455       A
2   2  0.06717385       B
3   3 -0.02827242       C

Jetzt möchten Sie "schlecht" und "schlecht" in "gut" und "am besten" ändern. Sie können verwenden 

colnames(df)[which(colnames(df) %in% c("bad","worst") )] <- c("good","best")

Das führt zu 

  good      worse  best
1    1 -0.6010363    A
2    2  0.7336155    B
3    3  0.9435469    C
10
discipulus

Sie können die Bearbeitung einfach durch:

newprice <- edit(newprice)

und ändern Sie den Spaltennamen manuell.

8
Baykal

versuchen:

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

Meine Spaltennamen sind wie folgt

colnames(t)
[1] "Class"    "Sex"      "Age"      "Survived" "Freq" 

Ich möchte den Spaltennamen von Klasse und Geschlecht ändern

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")
5
Mehul Katara

Nur um Scott Wilson zu korrigieren und zu erweitern.
Sie können die setnames-Funktion von data.table auch für data.frames verwenden. 

Erwarten Sie keine Beschleunigung des Vorgangs. Sie können jedoch erwarten, dass die setnames für den Speicherverbrauch effizienter ist, da die Spaltennamen durch Verweis aktualisiert werden. Dies kann mit der address-Funktion verfolgt werden, 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 Ihre Speichergrenzen stoßen, sollten Sie stattdessen diese verwenden.

5
jangorecki

Das 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'))
2
Chris

Falls wir 2 Datenrahmen haben, funktioniert das folgende

 DF1<-data.frame('a', 'b')
 DF2<-data.frame('c','d')

Wir ändern die Namen von DF1 wie folgt

 colnames(DF1)<- colnames(DF2)
1
Raghavan vmvs

Es gibt einige Optionen mit dplyr::rename() und 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

Es gibt auch drei Bereichsvarianten von dplyr::rename(): dplyr::rename_all() für alle Spaltennamen, dplyr::rename_if() für das bedingte Targeting von Spaltennamen und dplyr::rename_at() für ausgewählte benannte Spalten. Das folgende Beispiel ersetzt Leerzeichen und Punkte durch einen Unterstrich und konvertiert alles in Kleinbuchstaben:

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 auch auf ähnliche 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
1
sbha

Verwenden Sie diese Option, um den Spaltennamen nach der Funktion Colname zu ändern.

colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"
0
Sophanna

Das hättest du sofort tun können 

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

Der Befehl zum Einfügen, den Sie verwenden, erfordert mindestens zwei Argumente. Es funktioniert wie eine verkettete Funktion in Excel, weshalb es einen Fehler gibt, denke ich.

0
Aayush Agrawal

Abrufen der Daten mit den ausgewählten Spalten

get.the.df <- read_Excel("df.xls") %>%    
          select("X1","X2","X3");names(get.the.df)

ändere den Namen der Spalten von get.the.df colnames(get.the.df) <- c("X22","X11","X33");names(get.the.df)

0
Seyma Kalay