Prima guarda i nomi: names() e colnames()
I nomi delle colonne stanno in un attributo che puoi leggere come qualsiasi vettore. Su un data frame, sia names() sia colnames() lo restituiscono:
Stessa risposta. L'unica vera differenza: colnames() funziona anche sulle matrici, names() no, quindi il codice generico usa colnames(). Per i data frame di tutti i giorni sono intercambiabili.
L'idea chiave per tutto quello che segue: rinominare una colonna significa assegnare in questo vettore. Non esiste una funzione di base dedicata; modifichi names(df) con la stessa indicizzazione che usi su qualsiasi vettore.
Rinominare per posizione (funziona, ma è fragile)
Indicizza il vettore dei nomi per posizione e assegna:
La colonna 2 ora si chiama price. Va bene per una correzione veloce al volo, ed è un tranello in uno script. Le posizioni sono una promessa sull'ordine delle colonne, e l'ordine delle colonne è la cosa meno stabile dei dati importati: il giorno in cui il CSV che leggi guadagna una colonna in più, names(df)[2] rinomina quella sbagliata, in silenzio. Se uno script rinomina per posizione, un cambio di schema lo rompe senza nessun messaggio di errore.
Rinominare per nome (l'idioma di base più solido)
Abbina il vecchio nome invece di fidarti di una posizione:
Leggi prima la parte interna: names(sales) == "prc" produce FALSE TRUE FALSE, una maschera logica sul vettore dei nomi. Indicizzando con essa selezioni l'elemento corrispondente, e l'assegnazione lo sostituisce. Se "prc" non c'è, nulla corrisponde e nulla cambia (nessun errore, quindi controlla il risultato). Questo idioma sopravvive a riordini, colonne aggiunte e copia e incolla in altri script. Imparalo a memoria: è la risposta di R base a "come rinomino una colonna".
Più colonne insieme
Sostituisci l'intero vettore quando dai un nome a tutte le colonne (succede spesso subito dopo un'importazione), oppure usa match() per rinominare un sottoinsieme scelto:
match(old, names(df)) restituisce le posizioni dei vecchi nomi, così i nuovi nomi finiscono esattamente dove stavano quelli vecchi: indipendente dall'ordine, come l'idioma per un solo nome. Se manca uno dei vecchi nomi, match() restituisce NA e l'assegnazione dà errore, ed è proprio il tipo di fallimento che vuoi: rumoroso.
setNames() per le pipeline
Tutti gli idiomi visti finora modificano una variabile in due passaggi. setNames(object, names) restituisce una copia rinominata in un'unica espressione, che è ciò che serve in una pipeline:
Comodo quando una funzione restituisce un data frame senza nomi o con nomi pessimi e vuoi sistemarlo in linea, read_something() |> setNames(c("id", "value")), senza una variabile temporanea.
Il modo dplyr: rename() e rename_with()
rename() di dplyr prende coppie new = old, con il nuovo nome per primo, e tutti prima o poi lo scrivono al contrario (codice statico: la sandbox esegue solo R base):
library(dplyr)
sales |> rename(price = prc, qty = q)
I vecchi nomi non toccati dalla chiamata restano come sono, e un vecchio nome scritto male provoca un errore vero invece di non fare nulla in silenzio: un miglioramento concreto rispetto all'idioma di base. Per rinominare seguendo una regola invece che per coppie, rename_with() applica una funzione ai nomi:
sales |> rename_with(toupper) # every column
sales |> rename_with(toupper, starts_with("p")) # just some
Guarda l'introduzione a dplyr per vedere come si inseriscono nella famiglia dei verbi.
Pulire le intestazioni disordinate importate
Le intestazioni dei CSV reali arrivano come "Order ID", "unit.price ($)", "2024 Total": nomi con spazi e simboli che ti obbligano a usare i backtick ovunque. make.names() di R base converte qualsiasi vettore di caratteri in nomi R validi:
Validi, ma brutti a modo loro (X2024.Total). Ecco perché molti team usano come standard clean_names() del pacchetto janitor, che produce un ordinato snake_case (order_id, unit_price, x2024_total) con una sola chiamata: df |> janitor::clean_names(). Se importi file disordinati ogni settimana, si ripaga subito.
Cosa ti porti a casa
- I nomi delle colonne sono solo un vettore: leggili con
names()/colnames()e rinomina assegnando al suo interno. names(df)[2] <- "new"è fragile;names(df)[names(df) == "old"] <- "new"è l'idioma da imparare a memoria.match()ne rinomina diverse per nome;setNames()rinomina in linea dentro una pipeline.rename(new = old)di dplyr dà errore sui nomi mancanti (bene) erename_with()rinomina seguendo una regola.- Per le intestazioni importate disordinate:
make.names()in R base,janitor::clean_names()per risultati eleganti.
Prossimo passo: l'ordinamento, cioè sort() per i vettori, il trucco di order() per i data frame e arrange().
Domande frequenti
Come si rinomina una colonna in R?
L'idioma di base più solido è abbinare per nome: names(df)[names(df) == "old"] <- "new". Trova la colonna chiamata old ovunque si trovi e la rinomina. In dplyr è rename(df, new = old): attenzione all'ordine, prima il nuovo nome.
Qual è la differenza tra names() e colnames()?
Su un data frame, in pratica nessuna: entrambe leggono e impostano i nomi delle colonne. colnames() funziona anche sulle matrici (dove names() no), quindi il codice pensato per gestire entrambe tende a usare colnames(). Sui normali data frame, usa quella che preferisci.
Come si rinomina una colonna per posizione in R?
Assegna nel vettore dei nomi in quella posizione: names(df)[2] <- "price" rinomina la seconda colonna. Funziona, ma è fragile: il giorno in cui si aggiunge una colonna o il CSV cambia l'ordine delle colonne, la posizione 2 è un'altra colonna. Meglio rinominare per nome.
Come si rinominano più colonne insieme in R?
Assegna un vettore completo: names(df) <- c("id", "name", "price") sostituisce tutti i nomi nell'ordine. Per rinominarne solo alcune per nome, usa match(): names(df)[match(c("old1", "old2"), names(df))] <- c("new1", "new2"). In dplyr: rename(df, new1 = old1, new2 = old2).