Menu

Cómo renombrar columnas en R (names, colnames, dplyr rename)

Renombrar columnas de un data frame en R: names() y colnames(), renombrar por posición vs por nombre, setNames(), rename() de dplyr y limpiar encabezados importados desordenados.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Primero mira los nombres: names() y colnames()

Los nombres de columna viven en un atributo que puedes leer como cualquier vector. names() y colnames() lo devuelven ambos para un data frame:

Misma respuesta. La única diferencia real: colnames() también funciona con matrices, names() no - por eso el código genérico usa colnames(). Para los data frames del día a día son intercambiables.

La idea clave para todo lo que sigue: renombrar una columna es asignar dentro de este vector. No hay una función de base dedicada; modificas names(df) con la misma indexación que usas en cualquier vector.

Renombrar por posición (funciona, pero es frágil)

Indexa el vector de nombres por posición y asigna:

La columna 2 ahora es price. Bien para un arreglo interactivo rápido - y una trampa en un script. Las posiciones son una promesa sobre el orden de las columnas, y el orden de las columnas es lo menos estable de los datos importados: el día que el CSV que lees gane una columna extra, names(df)[2] renombra la equivocada, en silencio. Si un script renombra por posición, un cambio de esquema lo rompe sin mensaje de error.

Renombrar por nombre (el idioma robusto de base)

Haz coincidir el nombre antiguo en lugar de confiar en una posición:

Lee primero la parte interior: names(sales) == "prc" produce FALSE TRUE FALSE - una máscara lógica sobre el vector de nombres. Indexar con ella selecciona la entrada coincidente, y la asignación la reemplaza. Si "prc" no está, nada coincide y nada cambia (sin error - así que revisa el resultado). Este idioma sobrevive a reordenaciones, columnas añadidas y copiar-pegar en otros scripts. Memorízalo; es la respuesta de R base a "renombrar una columna".

Varias a la vez

Reemplaza el vector completo cuando estés nombrando todas las columnas (habitual justo después de una importación), o usa match() para renombrar un subconjunto elegido:

match(old, names(df)) devuelve las posiciones de los nombres antiguos, de modo que los nombres nuevos caen exactamente donde estaban los antiguos - a prueba de reordenaciones, como el idioma de un solo nombre. Si falta algún nombre antiguo, match() devuelve NA y la asignación da error, que es el modo de fallo que quieres: ruidoso.

setNames() para pipelines

Todos los idiomas anteriores mutan una variable en dos pasos. setNames(object, names) devuelve una copia renombrada en una sola expresión, que es lo que un pipeline quiere:

Útil cuando una función devuelve un data frame sin nombres o mal nombrado y quieres arreglarlo en línea - read_something() |> setNames(c("id", "value")) - sin una variable temporal.

La forma dplyr: rename() y rename_with()

El rename() de dplyr recibe pares new = old - el nombre nuevo va primero, algo que todo el mundo invierte al menos una vez (estático; el sandbox solo ejecuta R base):

library(dplyr)

sales |> rename(price = prc, qty = q)

Los nombres antiguos no tocados por la llamada se conservan tal cual, y un nombre antiguo mal escrito es un error duro en lugar de un no-op silencioso - una mejora genuina sobre el idioma de base. Para renombrar por regla en lugar de por pares, rename_with() aplica una función a los nombres:

sales |> rename_with(toupper)                          # every column
sales |> rename_with(toupper, starts_with("p"))        # just some

Consulta la introducción a dplyr para ver cómo encajan en la familia de verbos.

Limpiar encabezados importados desordenados

Los encabezados de CSV reales llegan como "Order ID", "unit.price ($)", "2024 Total" - nombres con espacios y símbolos que obligan a entrecomillar con acentos graves por todas partes. El make.names() de R base convierte cualquier vector de caracteres en nombres válidos de R:

Válidos, pero feos a su manera (X2024.Total). Por eso muchos equipos se estandarizan en el clean_names() del paquete janitor, que produce un snake_case ordenado (order_id, unit_price, x2024_total) en una sola llamada: df |> janitor::clean_names(). Si importas archivos desordenados cada semana, se amortiza de inmediato.

Lo que te llevas

  • Los nombres de columna son solo un vector: léelos con names()/colnames(), renombra asignando dentro de él.
  • names(df)[2] <- "new" es frágil; names(df)[names(df) == "old"] <- "new" es el idioma a memorizar.
  • match() renombra varias por nombre; setNames() renombra en línea dentro de un pipeline.
  • El rename(new = old) de dplyr da error con nombres faltantes (bien) y rename_with() renombra por regla.
  • Para encabezados importados desordenados: make.names() en base, janitor::clean_names() para resultados bonitos.

A continuación: ordenar - sort() para vectores, el truco de order() para data frames, y arrange().

Preguntas frecuentes

¿Cómo renombro una columna en R?

El idioma robusto de base es hacer coincidir por nombre: names(df)[names(df) == "old"] <- "new". Encuentra la columna llamada old esté donde esté y la renombra. En dplyr es rename(df, new = old) - fíjate en el orden: el nombre nuevo va primero.

¿Cuál es la diferencia entre names() y colnames()?

En un data frame, ninguna en la práctica: ambas leen y establecen los nombres de columna. colnames() también funciona con matrices (donde names() no), así que el código pensado para manejar ambas tiende a usar colnames(). En data frames normales, usa la que prefieras.

¿Cómo renombro una columna por posición en R?

Asigna en el vector de nombres en esa posición: names(df)[2] <- "price" renombra la segunda columna. Funciona, pero es frágil: el día que se añada una columna o el CSV cambie el orden de columnas, la posición 2 es otra columna. Prefiere renombrar por nombre.

¿Cómo renombro varias columnas a la vez en R?

Asigna un vector completo: names(df) <- c("id", "name", "price") reemplaza todos los nombres en orden. Para renombrar unas cuantas elegidas por nombre, usa match(): names(df)[match(c("old1", "old2"), names(df))] <- c("new1", "new2"). En dplyr: rename(df, new1 = old1, new2 = old2).

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR