Come rinominare una singola colonna in un data.frame?


335

So che se ho un frame di dati con più di 1 colonna, posso usare

colnames(x) <- c("col1","col2")

per rinominare le colonne. Come faccio se è solo una colonna? Significa un vettore o un frame di dati con solo una colonna.

Esempio:

trSamp <- data.frame(sample(trainer$index, 10000))
head(trSamp )
#   sample.trainer.index..10000.
# 1                      5907862
# 2                      2181266
# 3                      7368504
# 4                      1949790
# 5                      3475174
# 6                      6062879

ncol(trSamp)
# [1] 1
class(trSamp)
# [1] "data.frame"
class(trSamp[1])
# [1] "data.frame"
class(trSamp[,1])
# [1] "numeric"
colnames(trSamp)[2] <- "newname2"
# Error in names(x) <- value : 
#   'names' attribute [2] must be the same length as the vector [1]

4
La soluzione di @ aix funzionerà per un data.frame a 1 colonna. Probabilmente verrai confuso drop=TRUEdall'argomento predefinito in [, che causa la conversione di un oggetto "1 colonna" in un vettore ... e i vettori non hanno colnames. Un esempio di ciò che hai provato sarebbe molto utile.
Joshua Ulrich,

2
funziona se usi "colnames (x) [1] <- 'newname2'"
screechOwl

Risposte:


345
colnames(trSamp)[2] <- "newname2"

tenta di impostare il nome della seconda colonna. Il tuo oggetto ha solo una colonna, quindi il comando genera un errore. Questo dovrebbe essere sufficiente:

colnames(trSamp) <- "newname2"

1
. @ JoshuaUlrich - Questo non sembra funzionare se il nome della colonna è simile a quello in "A,B,C,X,Y,Z"cui voglio rinominarlo Yusando testData[379] <- "Y".
Chetan Arvind Patil,

576

Questo è un modo generalizzato in cui non è necessario ricordare la posizione esatta della variabile:

# df = dataframe
# old.var.name = The name you don't like anymore
# new.var.name = The name you want to get

names(df)[names(df) == 'old.var.name'] <- 'new.var.name'

Questo codice praticamente fa quanto segue:

  1. names(df) esamina tutti i nomi in df
  2. [names(df) == old.var.name] estrae il nome della variabile che si desidera controllare
  3. <- 'new.var.name' assegna il nuovo nome di variabile.

5
Sono anche abbastanza nuovo con R, ho adorato questa soluzione! In realtà ho verificato cosa fa e penso che valga la pena specificare che [names(df) == old.var.name]restituisce effettivamente un vettore con valori vero / falso. Quindi ha il potenziale per modificare più nomi di colonne se, ad esempio, vengono utilizzate espressioni regolari.
mikyatope,

3
Per risultati di espressioni regolari, utilizzare qualcosa di simile names(df) = sub('pattern', 'replacement', names(df)). Altrimenti dovresti provare a impostare più colonne con lo stesso nome.
Siamo tutti Monica,

40
Sentimenti contrastanti ... in un mondo perfetto, in cui abbondano linguaggi di programmazione perfetti, richiederebbe davvero questo numero di tasti per cambiare il nome di una singola colonna? Adoro R ma a volte voglio strangolarlo per questo tipo di motivi.
tumultous_rooster il

4
Come non esiste una funzione wrapper per questo in base?
ifly6,

1
Come tutti desideriamo! Non so ora, ma allora non c'era alcun wrapper in base
Side_0o_Effect

85
colnames(df)[colnames(df) == 'oldName'] <- 'newName'

2
Mi piace questa soluzione in quanto puoi fare riferimento al nome della colonna per nome, anziché richiedere di sapere quale colonna di numero è. Meglio per funzioni di numero maggiore.
Cibernetico,

1
Ho una piccola estensione della domanda e questa risposta. Ho un frame di dati con una colonna che contiene le lettere "snp" . Voglio rinominarlo in "Marker" . Ma voglio usare un'espressione regolare per farlo. Apparentemente il codice che ho è difettoso:, colnames(GWASDATA_RAWSELECTION)[colnames(GWASDATA_RAWSELECTION)=="^snp$"] <- "Marker"perché la colonna non è stata rinominata. Se lo faccio names(GWASDATA_RAWSELECTION)[names(GWASDATA_RAWSELECTION)=="snp"] <- "Marker"che viene rinominato. Cosa mi sto perdendo?
Sander W. van der Laan,

76

Questa è una vecchia domanda, ma vale la pena notare che ora è possibile utilizzare setnamesdal data.tablepacchetto.

library(data.table)

setnames(DF, "oldName", "newName")

# or since the data.frame in question is just one column: 
setnames(DF, "newName")

# And for reference's sake, in general (more than once column)
nms <- c("col1.name", "col2.name", etc...)
setnames(DF, nms)

6
o setNamesdalla base R.
PatrickT

53

Questo può essere fatto anche usando il plyrpacchetto Hadley e la renamefunzione.

library(plyr) 
df <- data.frame(foo=rnorm(1000)) 
df <- rename(df,c('foo'='samples'))

Puoi rinominare il nome (senza conoscere la posizione) ed eseguire più rinominazioni contemporaneamente. Dopo aver fatto un'unione, ad esempio, potresti finire con:

  letterid id.x id.y
1       70    2    1
2      116    6    5
3      116    6    4
4      116    6    3
5      766   14    9
6      766   14   13

Che puoi quindi rinominare in un solo passaggio usando:

letters <- rename(letters,c("id.x" = "source", "id.y" = "target"))

  letterid source target
1       70      2      1
2      116      6      5
3      116      6      4
4      116      6      3
5      766     14      9
6      766     14     13

7
renameè ora una funzione anche nel dplyrpacchetto.
Sam Firke,

36

Penso che il modo migliore per rinominare le colonne sia usando il pacchetto dplyr in questo modo:

require(dplyr)
df = rename(df, new_col01 = old_col01, new_col02 = old_col02, ...)

Funziona allo stesso modo per rinominare una o più colonne in qualsiasi set di dati.


12

Mi piace lo stile successivo per rinominare i nomi delle colonne dei frame di dati uno per uno.

colnames(df)[which(colnames(df) == 'old_colname')] <- 'new_colname'

dove

which(colnames(df) == 'old_colname')

ritorna dall'indice della colonna specifica.


1
+1 per dare all'utente la possibilità di utilizzare il vecchio nome reale :)

1
Qual è la differenza rispetto alla soluzione di @zongshiwujie?
buhtz,

which()non è necessario.
sindri_baldur,

12

Trovo che il modo più conveniente per rinominare una singola colonna sia usare dplyr::rename_at:

library(dplyr)
cars %>% rename_at("speed",~"new") %>% head     
cars %>% rename_at(vars(speed),~"new") %>% head
cars %>% rename_at(1,~"new") %>% head

#   new dist
# 1   4    2
# 2   4   10
# 3   7    4
# 4   7   22
# 5   8   16
# 6   9   10
  • funziona bene in catene di tubi
  • conveniente quando i nomi sono memorizzati in variabili
  • funziona con un nome o un indice di colonna
  • chiaro e compatto

6

È possibile utilizzare il rename.varsnel gdatapacchetto.

library(gdata)
df <- rename.vars(df, from = "oldname", to = "newname")

Ciò è particolarmente utile quando hai più di un nome di variabile da modificare o vuoi aggiungere o pre-pendere del testo ai nomi delle variabili, quindi puoi fare qualcosa del tipo:

df <- rename.vars(df, from = c("old1", "old2", "old3", 
         to = c("new1", "new2", "new3"))

Per un esempio di aggiunta di testo a un sottoinsieme di nomi di variabili, consultare: https://stackoverflow.com/a/28870000/180892


Questo è il più semplice, grazie. Ho avuto problemi con il pacchetto dplyr.
DannyB,

4

Provare:

colnames(x)[2] <- 'newname2'

8
Questo è ciò che ha gettato l'errore richiesto da OP (nella sua modifica). Non funzionerà, poiché il frame di dati ha solo una colonna.

. @ NPE - Questo non sembra funzionare se il nome della colonna è qualcosa di simile a "A,B,C,X,Y,Z"dove voglio rinominarlo Yusando testData[379] <- "Y".
Chetan Arvind Patil,

4

Probabilmente questo è già là fuori, ma stavo giocando con la ridenominazione dei campi mentre cercavo una soluzione e ho provato questo per un capriccio. Ha funzionato per i miei scopi.

Table1$FieldNewName <- Table1$FieldOldName
Table1$FieldOldName <- NULL

La modifica inizia qui ....

Funziona anche questo.

df <- rename(df, c("oldColName" = "newColName"))

Per chi mi ha segnato, va bene, ma dal momento che sono ovviamente nuovo a farlo, forse potresti illuminare cosa c'era di sbagliato nella risposta.
Scottieie,

Non c'è niente di sbagliato nella tua risposta, a parte il fatto che non è un oneliner ... che era solo un utente SO ostile che non aveva il coraggio di giustificare la sua collera.
contare0

Grazie @ count0. In realtà è significativo avere alcuni punti di mana o qualunque cosa commentare una domanda, qualcosa che sono stato ancora in grado di fare. Seguire le domande in alcuni casi sarebbe bello mentre apprendo una nuova serie di competenze. Ancora. TY.
Scottieie,

1
dobbiamo usare il nome di tutte le colonne per usarlo.
Arpit Sisodia,

da quale pacchetto renameproviene la funzione?
Diego,

3

Se sai che il tuo frame di dati ha solo una colonna, puoi usare: names(trSamp) <- "newname2"


3

Puoi anche provare 'upData' dal pacchetto 'Hmisc'.

library(Hmisc)

trSamp = upData(trSamp, rename=c(sample.trainer.index..10000. = 'newname2'))


Molto bella! È anche possibile rinominare più colonne contemporaneamente: trSamp = upData (trSamp, rename = c (sample.trainer.index..10000. = 'Newname2, AnotherColumnName =' RenameThisColumn '))
FraNut

0

Alla domanda del PO è stata data una risposta positiva. Tuttavia, ecco un trucco che può essere utile in alcune situazioni: corrispondenza parziale del nome della colonna, indipendentemente dalla sua posizione in un frame di dati:

Corrispondenza parziale sul nome:

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("Reported", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

Un altro esempio: corrispondenza parziale sulla presenza di "punteggiatura":

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("[[:punct:]]", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

Questi erano esempi che dovevo affrontare oggi, pensavo che valesse la pena condividerli.



0

Possiamo usare rename_withper rinominare le colonne con una funzione ( stringrfunzioni, ad esempio).

Considera i seguenti dati df_1:

df_1 <- data.frame(
  x = replicate(n = 3, expr = rnorm(n = 3, mean = 10, sd = 1)), 
  y = sample(x = 1:2, size = 10, replace = TRUE)
)

names(df_1)

#[1] "x.1" "x.2" "x.3" "y" 

Rinomina tutte le variabili con dplyr::everything():

library(tidyverse)

df_1 %>% 
  rename_with(.data = ., .cols = everything(.), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "var_4"

Rinomina dal nome di particelle con alcuni dplyrverbi ( starts_with, ends_with, contains, matches, ...).

Esempio con .( xvariabili):

df_1 %>% 
  rename_with(.data = ., .cols = contains('.'), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "y"

Rinomina per classe con molte funzioni di prova di classe, come is.integer, is.numeric, is.factor...

Esempio con is.integer( y):

df_1 %>% 
  rename_with(.data = ., .cols = is.integer, 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "x.1"   "x.2"   "x.3"   "var_1"

L'avviso:

Messaggi di avviso: 1: In stri_replace_first_regex (stringa, modello, fix_replacement (sostituzione),: la lunghezza dell'oggetto più lunga non è un multiplo della lunghezza dell'oggetto più corta 2: In names [cols] <- .fn (names [cols], ...) : il numero di articoli da sostituire non è un multiplo della lunghezza di sostituzione

Non è rilevante, poiché è solo un'incoerenza seq_along(.)rispetto alla funzione di sostituzione.


-1

Vorrei semplicemente aggiungere una nuova colonna al frame di dati con il nome che desidero e ottenere i dati per essa dalla colonna esistente. come questo:

dataf$value=dataf$Article1Order

quindi rimuovo la vecchia colonna! come questo:

dataf$Article1Order<-NULL

Questo codice potrebbe sembrare sciocco! Ma funziona perfettamente ...


-1

Vorrei semplicemente modificare il nome di una colonna nel set di dati con il nuovo nome desiderato con il seguente codice: names (set di dati) [index_value] <- "new_col_name"


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.