Modifica dei nomi di colonna di un frame di dati


399

Ho un frame di dati chiamato "newprice" (vedi sotto) e voglio cambiare i nomi delle colonne nel mio programma in R.

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

In realtà questo è quello che sto facendo:

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

Non ho inserito questo in un ciclo perché voglio che il nome di ogni colonna sia diverso come vedi.

Quando incollo il mio programma in R console questo è l'output che mi dà:

> 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(“"

Ho provato ugualmente a utilizzare la c()funzione, ad esempio c("premium"), anziché la paste()funzione, ma senza risultati.

Qualcuno potrebbe aiutarmi a capirlo?


Se la risposta di Dirk funziona, il problema era che si stava lavorando con una matrice anziché con un frame di dati. Puoi verificarlo con is.matrixo str.
IRTFM,

3
Vedere questa risposta su dplyr :: rename stackoverflow.com/a/26146202/1831980
Rasmus Larsen

8
colnames(newprice)<- c("premium","change","newprice")
Tung Nguyen,

Il tuo errore non ha nulla a che fare con la qualità del tuo codice. Stai solo usando il simbolo sbagliato. Questo "non è riconosciuto da R, usa" invece. So che possono sembrare uguali. Guarda da vicino: "". Questo è tutto.
Edo,

Risposte:


595

Usa la colnames()funzione:

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

Puoi anche sottoinsieme:

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

12
@Dirk Perché non usare names () invece di colnames ()?
Antoine Lizée,

4
Grande! Puoi anche sottoinsieme più colonne contemporaneamente (utile su grandi cornici di dati). colnames(X)[c(1,2)] <- c("good", "better")
metakermit,

7
Prova setnames()nel data.tablepacchetto. Usa qualcosa di simile setnames(DT,"b","B")osetnames(DT,c("a","E"),c("A","F"))
dwstu l'

Stranamente, dopo aver impostato i nomi delle colonne del frame di dati q1, provando a mutare il frame di dati usando dplyrcome nei q1 <- q1 %>% mutate(rel_count = count / 482462)risultati nell'errore Error in mutate_impl(.data, dots) : unknown column 'days'(dove daysviene assegnato un nuovo nome alla colonna). Questo è davvero frustrante.
David Tonhofer,

176

Io lo uso questo:

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

7
Grazie. Penso che questo sia in qualche modo fastidioso con R: Perché è così difficile cambiare il nome della colonna se non si desidera utilizzare il numero di indice ma il vecchio nome :(
Arne

10
Questo metodo ha il vantaggio di non doversi preoccupare della posizione della colonna, purché si conosca il nome originale. Penso che questo sia il metodo preferito in quanto è possibile, in seguito, apportare modifiche al codice che modificano la posizione della colonna che si desidera rinominare.
Paulo S. Abreu,

78

L'errore è causato dalle "virgolette intelligenti" (o come si chiamano). La lezione qui è "non scrivere il codice in un" editor "che converte le virgolette in virgolette intelligenti".

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

Inoltre, non è necessario paste("premium")(la chiamata a pasteè ridondante) ed è una buona idea mettere gli spazi intorno <-per evitare confusione (ad es x <- -10; if(x<-3) "hi" else "bye"; x.).


51

Hai provato solo:

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

?


42

Il nuovo modo raccomandato per farlo è usare la setNamesfunzione. Vedere ?setNames. Poiché questo crea una nuova copia di data.frame, assicurati di assegnare il risultato all'originale data.frame, se questa è la tua intenzione.

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

Le versioni più recenti di R ti avvertiranno se lo usi colnamesin alcuni dei modi suggeriti dalle risposte precedenti.

Se fosse data.tableinvece un , potresti usare la data.tablefunzione setnames, che può modificare nomi di colonne specifici o un singolo nome di colonna come riferimento :

setnames(data_table, "old-name", "new-name")

2
penso che sia stato richiesto data.frame, non data.table
Helix123

35

Ho avuto lo stesso problema e questo pezzo di codice ha funzionato per me.

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

In breve, questo codice esegue le seguenti operazioni:

names(data)esamina tutti i nomi nel dataframe ( data)

[names(data) == oldVariableName]estrae il nome della variabile ( oldVariableName) che si desidera rinominare e <- "newVariableName"assegna il nuovo nome della variabile.


come funzionerebbe se avessi un vettore con ad esempio 3 oldVariableNames?
jiggunjer,

Esattamente quello che stavo cercando -> 2 pollici in su !!
SilSur,

19

Simile agli altri:

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

Abbastanza semplice e facile da modificare.


10

provare:

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

10

Se è necessario rinominare non tutte le colonne ma più colonne contemporaneamente quando si conoscono solo i nomi delle colonne precedenti, è possibile utilizzare la colnamesfunzione e l' %in%operatore. Esempio:

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

Ora vuoi cambiare "cattivo" e "peggiore" in "buono" e "migliore". Puoi usare

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

Questo risulta in

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

1
Tale codice presuppone che l'ordine dei nomi delle colonne sia uguale all'ordine degli inserti
Hillary Sanders

10

Usalo per cambiare il nome della colonna in base alla funzione colname.

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

8

Puoi semplicemente effettuare le modifiche:

newprice <- edit(newprice)

e cambia manualmente il nome della colonna.


Questo non funziona solo per elementi vettoriali e fattore? > locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
vagabondo,

Funziona almeno per i frame di dati. Questo è quello che so.
Baykal,

7

I nomi delle mie colonne sono i seguenti

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

Voglio cambiare il nome della colonna di classe e sesso

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

7

Ci sono un paio di opzioni con dplyr::rename()e 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

Esistono anche tre varianti di ambito dplyr::rename(): dplyr::rename_all()per tutti i nomi di colonna, dplyr::rename_if()per il targeting condizionale dei nomi di colonna e dplyr::rename_at()per selezionare le colonne con nome. L'esempio seguente sostituisce spazi e punti con un trattino basso e converte tutto in minuscolo:

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() può anche essere usato in modo simile:

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

6

Giusto per correggere ed estendere leggermente la risposta di Scott Wilson.
Puoi usare la setnamesfunzione data.table anche su data.frames.

Non aspettarti una maggiore velocità dell'operazione, ma puoi aspettarti setnamesche sia più efficiente per il consumo di memoria poiché aggiorna i nomi delle colonne per riferimento. Questo può essere monitorato con la addressfunzione, vedi sotto.

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)

Quindi, se stai colpendo i tuoi limiti di memoria, potresti considerare di usare questo.


3

Questo può essere utile:

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'))

1

Nel caso in cui abbiamo 2 frame di dati i seguenti lavori

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

Cambiamo i nomi di DF1 come segue

 colnames(DF1)<- colnames(DF2)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.