Antecedentes

Es frecuente que nos enfrentemos a conjuntos de datos en los que, por la razón que sea, los nombres de las columnas se repiten. Esto es típico en el “trabajo de oficina”. En principio puede no haber tanto problema, pero los usuarios de dplyr y otros paquetes del llamado tidyverse, no funcionan bien cuando los nombres de columna del dataframe están repetidos.

Le pregunté a chatGPT sobre cómo cambiar nombre a columnas repetidas, y me propuso un código en r, el cual no funcionó directamente, pero luego de unas pocas modificaciones, queda así.

Mi información de contacto se puede encontrar en mi web personal.

Pasos previos

En primer lugar, se cargan las librerías que pensamos utilizar.

>  library(tidyverse)

Ahora, vamos a crear un conjunto de datos con columnas repetidas, simulando las tablas o planillas que os de planillas que habitualmente comparten en la oficina parten en la oficina)

> 
> 
> # Definir la cantidad de filas que deseas en tu tabla
> numero_filas <- 1500
> 
> # Generar nombres ficticios
> nombres <- c("Juan Perez", "Maria Lopez", "Pedro Gomez", "Ana Ruiz", "Santiago Vega", "Laura Diaz", "Carlos Rodriguez", "Elena Martinez", "Luis Fernandez", "Andrea Garcia", "Roberto Carlos", "Zinedine Zidane", "Marcelo Salas", "Fernando Gonzalez", "Isidora Jimenez", "Lucila Godoy", "Carmela Carvajal")
> 
> # Generar fechas de nacimiento ficticias
> fechas_nacimiento <- as.Date(sample(seq(as.Date('1970/01/01'), as.Date('2004/12/31'), by="day"), numero_filas, replace = TRUE))
> 
> # Generar RUTs ficticios
> rut <- sample(10000000:99999999, numero_filas, replace = TRUE)
> 
> # Generar dígitos verificadores ficticios
> dv_rut <- sample(0:9, numero_filas, replace = TRUE)
> 
> # Generar sexo ficticio
> sexo <- sample(c("M", "F"), numero_filas, replace = TRUE)
> 
> # Calcular la edad a partir de la fecha de nacimiento
> hoy <- Sys.Date()
> edad <- as.numeric(difftime(hoy, fechas_nacimiento, units = "weeks"))
> edad<-round(edad/52,0)
> # Generar lugares de trabajo ficticios
> lugares_trabajo <- sample(c("Empresa X", "Empresa Y", "Empresa Z"), numero_filas, replace = TRUE)
> 
> # Crear el dataframe
> datos <- data.frame(
+   Nombre = sample(nombres, numero_filas, replace = TRUE),
+   Fecha_de_Nacimiento = fechas_nacimiento,
+   RUT = rut,
+   DV_RUT = dv_rut,
+   Sexo = sexo,
+   Edad = edad,
+   Lugar_de_Trabajo = lugares_trabajo
+ )
> 
> 
> ## ahora se replica tres veces las columnas
>  
> datos<-cbind(datos, datos, datos)
> 
> 
> str(datos)
'data.frame':   1500 obs. of  21 variables:
 $ Nombre             : chr  "Andrea Garcia" "Isidora Jimenez" "Juan Perez" "Andrea Garcia" ...
 $ Fecha_de_Nacimiento: Date, format: "1975-06-09" "1975-04-11" ...
 $ RUT                : int  90639353 77319342 89332557 98217488 12529555 28359202 96753319 75213534 86121260 27700588 ...
 $ DV_RUT             : int  8 4 4 8 1 0 9 1 3 2 ...
 $ Sexo               : chr  "F" "M" "F" "F" ...
 $ Edad               : num  49 49 27 22 39 46 25 22 20 37 ...
 $ Lugar_de_Trabajo   : chr  "Empresa X" "Empresa X" "Empresa Z" "Empresa X" ...
 $ Nombre             : chr  "Andrea Garcia" "Isidora Jimenez" "Juan Perez" "Andrea Garcia" ...
 $ Fecha_de_Nacimiento: Date, format: "1975-06-09" "1975-04-11" ...
 $ RUT                : int  90639353 77319342 89332557 98217488 12529555 28359202 96753319 75213534 86121260 27700588 ...
 $ DV_RUT             : int  8 4 4 8 1 0 9 1 3 2 ...
 $ Sexo               : chr  "F" "M" "F" "F" ...
 $ Edad               : num  49 49 27 22 39 46 25 22 20 37 ...
 $ Lugar_de_Trabajo   : chr  "Empresa X" "Empresa X" "Empresa Z" "Empresa X" ...
 $ Nombre             : chr  "Andrea Garcia" "Isidora Jimenez" "Juan Perez" "Andrea Garcia" ...
 $ Fecha_de_Nacimiento: Date, format: "1975-06-09" "1975-04-11" ...
 $ RUT                : int  90639353 77319342 89332557 98217488 12529555 28359202 96753319 75213534 86121260 27700588 ...
 $ DV_RUT             : int  8 4 4 8 1 0 9 1 3 2 ...
 $ Sexo               : chr  "F" "M" "F" "F" ...
 $ Edad               : num  49 49 27 22 39 46 25 22 20 37 ...
 $ Lugar_de_Trabajo   : chr  "Empresa X" "Empresa X" "Empresa Z" "Empresa X" ...

Como se ve, el dataframe tiene varias columnas con nombres repetidos.

Aquí viene el paso clave: en lugar de eliminar las columnas con nombre repetido, se usará la función make.unique para modificar los nombres repetidos

> 
> nombres_originales<-names(datos)
> 
> nombres_unicos <- make.unique(names(datos), sep = "_")
> 
> names(datos) <- nombres_unicos
> 
> 
> names(datos)
 [1] "Nombre"                "Fecha_de_Nacimiento"   "RUT"                  
 [4] "DV_RUT"                "Sexo"                  "Edad"                 
 [7] "Lugar_de_Trabajo"      "Nombre_1"              "Fecha_de_Nacimiento_1"
[10] "RUT_1"                 "DV_RUT_1"              "Sexo_1"               
[13] "Edad_1"                "Lugar_de_Trabajo_1"    "Nombre_2"             
[16] "Fecha_de_Nacimiento_2" "RUT_2"                 "DV_RUT_2"             
[19] "Sexo_2"                "Edad_2"                "Lugar_de_Trabajo_2"   

Listo. Recordemos que los nombres originales de las columnas eran los siguientes:

> nombres_originales
 [1] "Nombre"              "Fecha_de_Nacimiento" "RUT"                
 [4] "DV_RUT"              "Sexo"                "Edad"               
 [7] "Lugar_de_Trabajo"    "Nombre"              "Fecha_de_Nacimiento"
[10] "RUT"                 "DV_RUT"              "Sexo"               
[13] "Edad"                "Lugar_de_Trabajo"    "Nombre"             
[16] "Fecha_de_Nacimiento" "RUT"                 "DV_RUT"             
[19] "Sexo"                "Edad"                "Lugar_de_Trabajo"   

Por lo tanto, ahora sí se puede manejar la tabla con el paquete dplyr y otros.