Spaltennamen eines Datenrahmens ändern

399

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 ist dies, 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 gesetzt, 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 es mir gibt:

> 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 gleichermaßen versucht, die c()Funktion zu verwenden - zum Beispiel c("premium")anstelle der paste()Funktion, aber ohne Erfolg.

Könnte mir jemand helfen, das herauszufinden?

Sohn
quelle
Wenn Dirks Antwort funktioniert, bestand das Problem darin, dass Sie eher mit einer Matrix als mit einem Datenrahmen arbeiteten. Sie können dies entweder mit is.matrixoder überprüfen str.
IRTFM
3
Siehe diese Antwort auf dplyr :: rename stackoverflow.com/a/26146202/1831980
Rasmus Larsen
8
colnames(newprice)<- c("premium","change","newprice")
Tung Nguyen
Ihr Fehler hat nichts mit der Qualität Ihres Codes zu tun. Sie verwenden nur das falsche Symbol. Dies "wird von R nicht erkannt, verwenden Sie stattdessen". Ich weiß, dass sie möglicherweise gleich aussehen. Schauen Sie genau hin: "". Das ist es.
Edo

Antworten:

594

Verwenden Sie die colnames()Funktion:

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 Teilmenge:

R> colnames(X)[2] <- "superduper"
Dirk Eddelbuettel
quelle
12
@Dirk Warum nicht names () anstelle von colnames () verwenden?
Antoine Lizée
4
Großartig! Sie können auch mehrere Spalten gleichzeitig unterteilen (nützlich bei Big-Data-Frames). colnames(X)[c(1,2)] <- c("good", "better")
Metakermit
7
Versuchen Sie es setnames()im data.tablePaket. Verwenden Sie so etwas wie setnames(DT,"b","B")odersetnames(DT,c("a","E"),c("A","F"))
dwstu
Seltsamerweise führt der q1Versuch, den Datenrahmen mit dplyrwie in zu mutieren , nach dem Festlegen der Spaltennamen des Datenrahmens q1 <- q1 %>% mutate(rel_count = count / 482462)zu dem Fehler Error in mutate_impl(.data, dots) : unknown column 'days'(wobei daysder Spalte ein neuer Name gegeben wird). Das ist wirklich frustrierend.
David Tonhofer
176

Ich benutze das:

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
Matheus Abreu
quelle
7
Vielen Dank. Ich denke, das ist irgendwie ärgerlich mit R: Warum ist es so schwierig, den Spaltennamen zu ändern, wenn Sie nicht die Indexnummer, sondern den alten Namen verwenden möchten :(
Arne
10
Diese Methode hat den Vorteil, dass Sie sich keine Gedanken über die Position der Spalte machen müssen, solange Sie den ursprünglichen Namen kennen. Ich denke, dies ist die bevorzugte Methode, da Sie später möglicherweise Änderungen am Code vornehmen können, die die Position der Spalte ändern, die Sie umbenennen möchten.
Paulo S. Abreu
78

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

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

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

Joshua Ulrich
quelle
51

Hast du es gerade versucht:

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

?

Jamie
quelle
42

Die neue empfohlene Methode hierfür ist die Verwendung der setNamesFunktion. Siehe ?setNames. Da dies eine neue Kopie von erstellt data.frame, müssen Sie das Ergebnis dem Original zuweisen data.frame, wenn dies Ihre Absicht ist.

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

Neuere Versionen von R geben Ihnen eine Warnung, wenn Sie colnameseinige der in früheren Antworten vorgeschlagenen Methoden verwenden.

Wenn dies data.tablestattdessen ein wäre, könnten Sie die data.tableFunktion verwenden setnames, mit der bestimmte Spaltennamen oder ein einzelner Spaltenname durch Bezugnahme geändert werden können :

setnames(data_table, "old-name", "new-name")
Scott C Wilson
quelle
2
Ich denke, es wurde nach data.frame gefragt, nicht nach data.table
Helix123
35

Ich hatte das gleiche Problem und dieser Code hat für mich funktioniert.

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

Kurz gesagt, dieser Code führt Folgendes aus:

names(data)untersucht alle Namen im Datenrahmen ( data)

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

Desta Haileselassie Hagos
quelle
Wie würde das funktionieren, wenn Sie einen Vektor mit zB 3 alten Variablennamen hätten?
Jiggunjer
Genau das, wonach ich gesucht habe -> 2 Daumen hoch !!
SilSur
19

Ähnlich wie bei den anderen:

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

Ganz einfach und leicht zu modifizieren.

Adam Erickson
quelle
10

Versuchen:

names(newprice) <- c("premium", "change", "newprice")
Ngamita
quelle
10

Wenn Sie nicht alle, sondern mehrere Spalten gleichzeitig umbenennen müssen, wenn Sie nur die alten Spaltennamen kennen, können Sie colnamesFunktion und %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
Discipulus
quelle
1
Dieser Code setzt voraus, dass die Reihenfolge Ihrer Spaltennamen der Reihenfolge der Einfügungen entspricht
Hillary Sanders
10

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"
Sophanna
quelle
8

Sie können die Bearbeitung einfach durchführen, indem Sie:

newprice <- edit(newprice)

und ändern Sie den Spaltennamen manuell.

Baykal
quelle
Funktioniert das nicht nur für Vektor- und Faktorelemente? > locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
Vagabund
Es funktioniert zumindest für Datenrahmen. Das weiß ich.
Baykal
7

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")
Mehul Katara
quelle
7

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 Varianten mit Gültigkeitsbereich 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
sbha
quelle
6

Nur um die Antwort von Scott Wilson zu korrigieren und leicht zu erweitern.
Sie können die setnamesFunktion von data.table auch für data.frames verwenden.

Erwarten Sie keine Beschleunigung des Vorgangs, aber Sie können erwarten setnames, dass der Vorgang für den Speicherverbrauch effizienter ist, da er die Spaltennamen anhand der Referenz aktualisiert. Dies kann mit der addressFunktion 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, können Sie stattdessen diese verwenden.

jangorecki
quelle
3

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'))
Chris
quelle
1

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)
Raghavan vmvs
quelle