8 pasos para transformar datos de panel en R
Tutorial para pasar los datos de formato largo a formato ancho y viceversa
Lo más normal cuando trabajamos con datos es que no los encontramos en el formato que queremos.
Es muy común que queremos que los datos sean visuales y nos aparecen en columnas en panel o al contrario. Afortunadamente, el software estadístico viene con paqueterías que ya nos solucionan este problema.
Sólo tenemos que aprender a usar las funciones que transforman los datos.
En este tutorial, aprenderás un paso a paso para transformar un conjunto de datos en R. Usaremos un ejemplo del Producto Interno Bruto (PIB) per cápita y aprenderemos funciones clave como reshape
, tidyr
y data.table
para reorganizar nuestros datos de formato largo a ancho y viceversa.
¿Listos? Adelante…
Paso #1: Comprender el Problema y Preparar los Datos
Imagina que deseas analizar el crecimiento económico de varios países entre 2000 y 2020.
Tienes un conjunto de datos con tres columnas: País, Año y PIB_per_Cápita. Sin embargo, está en formato largo, lo que dificulta las comparaciones directas entre países a lo largo del tiempo. Este formato es útil para ciertos análisis estadísticos, pero no es el más intuitivo para visualizar o comparar datos rápidamente.
Necesitamos transformar este conjunto de datos al formato ancho, donde cada país tenga su propia columna de PIB per cápita para cada año.
Ejecuta el siguiente código en R para crear y mostrar los datos:
# Creamos un ejemplo simulado
countries <- rep(c("Argentina", "Brasil", "Chile", "México"), each = 21)
years <- rep(2000:2020, times = 4)
gdp_per_capita <- runif(84, 8000, 20000)
data_long <- data.frame(
País = countries,
Año = years,
PIB_per_Cápita = gdp_per_capita
)
head(data_long)
¿Por Qué Necesitamos Transformar los Datos?
Los datos en formato largo pueden ser poco prácticos para ciertos análisis.
Si deseas comparar gráficamente el PIB per cápita de varios países a lo largo del tiempo, el formato largo complica el proceso. En cambio, un formato ancho facilita la creación de gráficos y comparaciones directas. Además, tener los datos reorganizados mejora la legibilidad y comprensión de la información.
Transformar nuestros datos nos permitirá visualizar tendencias y realizar análisis más efectivos.
Paso #2: Exploración y Limpieza Inicial de los Datos
Antes de cualquier transformación, necesitamos explorar y limpiar nuestros datos.
Esto implica verificar si hay valores faltantes, duplicados o inconsistencias. Una base de datos limpia garantiza resultados confiables y evita errores en etapas posteriores del análisis.
Ejecuta el siguiente código para explorar tus datos:
# Verificamos la estructura y posibles problemas
str(data_long)
summary(data_long)
# Revisamos si hay valores faltantes
sum(is.na(data_long))
Paso #3: Transformación con reshape
La función reshape
de R es una herramienta clásica para reorganizar data frames.
Nos permite cambiar entre formatos largo y ancho, adaptándose a nuestras necesidades analíticas. Aunque puede parecer intimidante al principio, su uso es bastante directo una vez que entiendes sus parámetros clave.
Utiliza este código para transformar tus datos al formato ancho:
# Transformamos el data frame de formato largo a ancho
data_wide <- reshape(
data_long,
timevar = "Año",
idvar = "País",
direction = "wide"
)
head(data_wide)
Ahora, profundicemos en lo que acabamos de hacer.
La función reshape()
requiere especificar varios argumentos clave:
data
: El data frame que deseas transformar (en este caso,data_long
).timevar
: La variable que identifica el tiempo o las diferentes instancias que deseas convertir en columnas. Aquí,Año
es nuestra variable de tiempo, ya que queremos que cada año sea una columna separada.idvar
: La variable que identifica las unidades únicas en tus datos. En este caso,País
es nuestro identificador, ya que queremos que cada fila represente un país único.direction
: La dirección de la transformación. Usamos"wide"
para convertir de formato largo a ancho.
Indica siempre correctamente las variables timevar
e idvar
.
Si no las especificamos adecuadamente, R no sabrá cómo reorganizar los datos. timevar
le dice a R qué variable debe expandir en columnas (cada año en nuestro caso), mientras que idvar
le indica cómo agrupar las filas (cada país). Al hacerlo correctamente, obtenemos un data frame donde cada país tiene una fila única y los años se despliegan como columnas con sus respectivos valores de PIB per cápita.
Paso #4: Transformación Moderna con tidyr
tidyr
es un paquete de R que simplifica la reorganización de datos.
Con funciones intuitivas como spread()
, puedes transformar tus datos de manera más legible y eficiente. Es una excelente alternativa moderna a reshape()
, especialmente si prefieres código más limpio.
Prueba el siguiente código:
# Instalamos tidyr si no está disponible
if (!require(tidyr)) install.packages("tidyr")
library(tidyr)
# Usamos spread para transformar los datos
data_wide_tidyr <- spread(data_long, key = Año, value = PIB_per_Cápita)
head(data_wide_tidyr)
Aquí, la función spread()
simplifica el proceso.
data
: Nuestro data frame original (data_long
).key
: La variable que queremos convertir en columnas (Año
).value
: Los valores que llenarán las nuevas columnas (PIB_per_Cápita
).
El resultado es similar, pero los nombres de las columnas son más limpios.
Cada columna se nombra directamente con el año correspondiente, facilitando la lectura y el acceso a los datos. Esto mejora la legibilidad y hace que el código sea más intuitivo.
Paso #5: Reorganización Eficiente con data.table
Cuando trabajas con grandes volúmenes de datos, la eficiencia es clave.
data.table
es un paquete optimizado para manejar grandes conjuntos de datos de manera rápida y eficiente. Su función dcast()
es especialmente útil para transformar datos, ofreciendo un rendimiento superior.
Implementa este código para usar data.table
:
# Convertimos el data frame a data.table
if (!require(data.table)) install.packages("data.table")
library(data.table)
data_long_dt <- as.data.table(data_long)
# Usamos dcast para transformar
data_wide_dt <- dcast(data_long_dt, País ~ Año, value.var = "PIB_per_Cápita")
head(data_wide_dt)
Desglosemos cómo funciona dcast()
:
data
: Nuestro data.table (data_long_dt
).La fórmula
País ~ Año
: Indica que queremos quePaís
sea nuestra variable identificadora (filas) yAño
nuestras nuevas columnas.value.var
: La variable cuyos valores llenarán las nuevas celdas (PIB_per_Cápita
).
La sintaxis de dcast()
es concisa y eficiente.
Es especialmente útil cuando manejas conjuntos de datos muy grandes, ya que data.table
está optimizado para operaciones de alta velocidad y bajo consumo de memoria.
Paso #6: Transformación Inversa: De Ancho a Largo
A veces, necesitarás regresar al formato largo.
Esto es común cuando preparas datos para ciertos modelos estadísticos que requieren este formato. Saber cómo alternar entre formatos te da flexibilidad y control sobre tus análisis.
Utiliza el siguiente código para transformar de ancho a largo:
# Con reshape
data_long_again <- reshape(
data_wide,
varying = names(data_wide)[-1],
v.names = "PIB_per_Cápita",
timevar = "Año",
times = sub("PIB_per_Cápita.", "", names(data_wide)[-1]),
direction = "long"
)
head(data_long_again)
Explicación de los argumentos:
data
: El data frame ancho que queremos transformar (data_wide
).varying
: Las columnas que varían y que queremos reunir en una sola columna. Usamosnames(data_wide)[-1]
para seleccionar todas las columnas exceptoPaís
.v.names
: El nombre de la variable que contendrá los valores reunidos (PIB_per_Cápita
).timevar
: El nombre de la nueva variable que contendrá los tiempos (Año
).times
: Los valores que tomarátimevar
. Usamossub()
para extraer los años de los nombres de las columnas.direction
: Especificamos"long"
para transformar de ancho a largo.
Es fundamental asignar correctamente varying
, v.names
, timevar
y times
.
Estos parámetros le indican a R cómo descomponer el data frame ancho en un formato largo, agrupando las columnas de años en una sola columna de valores y creando una nueva columna que indique el año correspondiente.
Paso #7: Visualiza los Datos Transformados
Con los datos en formato ancho, puedes crear visualizaciones más efectivas.
Por ejemplo, un gráfico de líneas que muestre el PIB per cápita de cada país a lo largo del tiempo. Esto facilita la identificación de tendencias y comparaciones directas entre países.
Genera el siguiente gráfico:
library(ggplot2)
ggplot(data_long, aes(x = Año, y = PIB_per_Cápita, color = País)) +
geom_line(size = 1) +
labs(title = "Evolución del PIB per Cápita (2000-2020)",
x = "Año",
y = "PIB per Cápita (USD)") +
theme_minimal()
Este gráfico te permite visualizar claramente las tendencias económicas.
Al tener los datos correctamente organizados, crear visualizaciones como esta se vuelve mucho más sencillo. Puedes identificar fácilmente patrones, comparar el desempeño entre países y detectar anomalías o eventos económicos significativos.
Paso #8: Automatiza el Proceso con Funciones
Para optimizar tu flujo de trabajo, es útil crear funciones que automaticen tareas repetitivas.
Esto no solo ahorra tiempo, sino que también reduce la posibilidad de errores cuando te topes con esta tarea una y otra vez. Al encapsular tu código en funciones, puedes reutilizarlo fácilmente en futuros proyectos.
Aquí tienes cómo hacerlo:
# Función para transformar de largo a ancho usando reshape
long_to_wide <- function(data, id_var, time_var, value_var) {
reshape(
data,
timevar = time_var,
idvar = id_var,
direction = "wide"
)
}
# Función para transformar de ancho a largo usando reshape
wide_to_long <- function(data, id_var, varying_vars_prefix) {
reshape(
data,
varying = names(data)[grep(varying_vars_prefix, names(data))],
v.names = sub(paste0(varying_vars_prefix, "."), "", varying_vars_prefix),
timevar = "Tiempo",
times = sub(paste0(varying_vars_prefix, "."), "", names(data)[grep(varying_vars_prefix, names(data))]),
direction = "long"
)
}
Estas funciones personalizadas te permiten transformar tus datos con facilidad.
Solo necesitas especificar las variables clave, y la función se encarga del resto. Esto es especialmente útil cuando trabajas con múltiples conjuntos de datos que requieren las mismas transformaciones.
Si hiciste este tutorial paso por paso, crear esta función te será más fácil. Lo mejor es que la puedes adaptar a tus necesidades.
Transformar y reorganizar datos es una habilidad esencial para cualquier economista.
Al dominar estas técnicas, puedes adaptar los datos a tus necesidades analíticas y facilitar la extracción de insights valiosos. Recuerda que entender a fondo las funciones y sus argumentos te permite utilizarlas de manera más efectiva y evita posibles errores.
¡Ahora es tu turno de explorar y descubrir el poder de la manipulación de datos en R!
¡Gracias por seguir este tutorial!
Si tienes preguntas o necesitas ayuda adicional, no dudes en comentar.
Tu crecimiento en estas habilidades será invaluable en tu carrera como economista e investigador.