R Academy · Lección

De formato ancho a largo con pivot_longer()

Reestructure tablas de formato ancho al formato largo ordenado para analizarlas.

Lección 1 de 413 pasos

De formato ancho a largo con pivot_longer() es una lección gratuita de R Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de R Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de R Academy incluye 4 lecciones en total.

Formatos de datos ancho y largo

Los datos pueden almacenarse en formato ancho (una fila por sujeto y varias columnas de valores) o en formato largo (una fila por observación, una columna para el nombre de la variable y otra para el valor). Muchos paquetes de R para visualización y modelado esperan datos en formato largo.

library(tidyr)
library(dplyr)

# Wide format: each quarter is a column
wide_df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, 90, 78),
  q2 = c(88, 85, 80),
  q3 = c(92, 88, 84)
)

print(wide_df)
cat('\nShape:', nrow(wide_df), 'rows x', ncol(wide_df), 'cols')

Conceptos básicos de pivot_longer()

pivot_longer(df, cols, names_to, values_to) convierte el formato ancho en formato largo. cols especifica qué columnas se transforman, names_to es la nueva columna para los nombres de las columnas antiguas y values_to es la nueva columna para los valores.

library(tidyr)

wide_df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, 90, 78),
  q2 = c(88, 85, 80),
  q3 = c(92, 88, 84)
)

long_df <- pivot_longer(
  wide_df,
  cols = c(q1, q2, q3),
  names_to = 'quarter',
  values_to = 'score'
)

print(long_df)

Seleccionar columnas con starts_with()

En lugar de enumerar las columnas explícitamente, use auxiliares de tidyselect dentro de cols. starts_with('prefix'), ends_with('suffix') y contains('string') son especialmente útiles para transformar de forma coherente columnas con nombres relacionados.

library(tidyr)

df <- data.frame(
  id = 1:3,
  sales_jan = c(100, 200, 150),
  sales_feb = c(120, 180, 160),
  sales_mar = c(130, 190, 170)
)

# Select all sales_ columns automatically
pivot_longer(
  df,
  cols = starts_with('sales_'),
  names_to = 'month',
  values_to = 'sales'
)

Excluir columnas con -col

Otro enfoque consiste en especificar qué columnas se deben excluir de la transformación mediante -col_name. Todas las demás se transforman. Esto resulta práctico cuando solo hay una o dos columnas de identificadores y muchas columnas de valores.

library(tidyr)

df <- data.frame(
  region = c('East','West'),
  jan = c(100, 200),
  feb = c(110, 210),
  mar = c(120, 220),
  apr = c(130, 230)
)

# Pivot everything except 'region'
pivot_longer(df, cols = -region, names_to = 'month', values_to = 'revenue')

names_prefix — Quitar prefijos

Cuando los nombres de las columnas tienen un prefijo como score_q1 y score_q2, el argumento names_prefix elimina ese prefijo de la columna names_to resultante. Así se mantiene limpio el identificador.

library(tidyr)

df <- data.frame(
  id = 1:3,
  score_q1 = c(85, 90, 78),
  score_q2 = c(88, 85, 80),
  score_q3 = c(92, 88, 84)
)

pivot_longer(
  df,
  cols = starts_with('score_'),
  names_to = 'quarter',
  names_prefix = 'score_',
  values_to = 'score'
)

Transformar varios conjuntos de columnas

Cuando tiene varios grupos de columnas de valores (por ejemplo, sales_q1 y cost_q1), use names_to con varios valores y names_pattern para dividir los nombres de las columnas en partes.

library(tidyr)

df <- data.frame(
  id = 1:2,
  sales_q1 = c(100, 200),
  sales_q2 = c(110, 210),
  cost_q1 = c(60, 110),
  cost_q2 = c(65, 115)
)

pivot_longer(
  df,
  cols = -id,
  names_to = c('.value', 'quarter'),
  names_pattern = '(.+)_(q[0-9]+)'
)

names_transform — Convertir tipos

De forma predeterminada, la nueva columna de nombres es de tipo carácter. Use names_transform para convertir automáticamente la columna de nombres a otro tipo (por ejemplo, obtener el año como entero a partir de nombres de columna como y2020 y y2021).

library(tidyr)

df <- data.frame(
  product = c('A','B'),
  y2021 = c(100, 200),
  y2022 = c(110, 210),
  y2023 = c(120, 220)
)

result <- pivot_longer(
  df,
  cols = -product,
  names_to = 'year',
  names_prefix = 'y',
  names_transform = list(year = as.integer),
  values_to = 'sales'
)

print(result)
cat('year column type:', class(result$year))

values_drop_na — Eliminar valores ausentes

Cuando el formato ancho contiene valores ausentes para algunas combinaciones de columna y fila, estos aparecen como NA en el formato largo. Establezca values_drop_na = TRUE para eliminar automáticamente las filas cuyo valor sea NA.

library(tidyr)

df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, NA, 78),
  q2 = c(88, 85, NA),
  q3 = c(NA, 88, 84)
)

# Without drop: 9 rows including NAs
pivot_longer(df, -student, names_to='quarter', values_to='score',
             values_drop_na = TRUE)

El formato largo permite usar ggplot2

La razón más importante para transformar los datos al formato largo es que ggplot2 asigna las estéticas a partir de las columnas. Cuando todos los valores están en una columna y sus categorías en otra, puede usar color = quarter o facet_wrap(~quarter) sin esfuerzo.

library(tidyr)
# (ggplot2 not run here, but showing the data preparation)

df <- data.frame(
  month = c('Jan','Feb','Mar'),
  product_A = c(100, 120, 110),
  product_B = c(200, 190, 210)
)

# After pivoting, ready for ggplot2:
long_df <- pivot_longer(df, -month, names_to='product', values_to='sales')
print(long_df)
# ggplot(long_df, aes(x=month, y=sales, color=product)) + geom_line()

Transformar columnas con nombres numéricos

A veces, los nombres de las columnas son números puros (por ejemplo, años: 2020, 2021). En R, los nombres de columna numéricos se escriben entre comillas en los data frames. Use num_range('', 2020:2023) o comillas invertidas en el argumento cols para gestionarlos.

library(tidyr)

# Year columns as numbers (common in census-style data)
df <- data.frame(
  country = c('US','UK'),
  '2021' = c(100, 80),
  '2022' = c(110, 85),
  '2023' = c(120, 90),
  check.names = FALSE
)

pivot_longer(
  df,
  cols = c('2021','2022','2023'),
  names_to = 'year',
  values_to = 'gdp_index'
)

Comparar los resultados de la transformación

Después de transformar los datos, valide el resultado: el número de filas debería ser nrow(wide) * n_pivoted_cols, y los valores únicos de la columna names_to deberían coincidir con los nombres de columna originales, menos el prefijo si se eliminó.

library(tidyr)

wide <- data.frame(
  id = 1:4,
  jan = c(10,20,30,40),
  feb = c(11,21,31,41),
  mar = c(12,22,32,42)
)

long <- pivot_longer(wide, -id, names_to='month', values_to='value')

cat('Wide rows:', nrow(wide), '\n')
cat('Long rows:', nrow(long), '(expected', nrow(wide)*3, ')\n')
cat('Months:', paste(unique(long$month), collapse=', '), '\n')

Comprobación rápida

¿Qué hace el argumento names_prefix en pivot_longer()?

Repaso: pivot_longer()

Ideas clave para convertir datos de formato ancho a largo:

  • pivot_longer(df, cols, names_to, values_to) es la función principal
  • cols acepta tidyselect: starts_with(), -id_col, c('a','b')
  • names_prefix elimina una cadena inicial de los nombres de las columnas
  • names_transform convierte el tipo de la columna de nombres (por ejemplo, a entero)
  • values_drop_na = TRUE elimina automáticamente las filas con NA
  • El formato largo es necesario para ggplot2, la mayoría de las funciones de modelado y las pruebas estadísticas
  • Valide el resultado: filas en formato largo = filas en formato ancho × número de columnas transformadas
library(tidyr)

df <- data.frame(
  team = c('Alpha','Beta'),
  sales_2022 = c(100, 200),
  sales_2023 = c(120, 220),
  sales_2024 = c(140, 240)
)

pivot_longer(
  df,
  cols = starts_with('sales_'),
  names_to = 'year',
  names_prefix = 'sales_',
  names_transform = list(year = as.integer),
  values_to = 'revenue'
)
Gratis para empezar

Aprende R con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
43
Lecciones
159

Preguntas frecuentes

¿La lección «De formato ancho a largo con pivot_longer()» es gratis?

Sí — el texto completo de «De formato ancho a largo con pivot_longer()» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de R Academy, actualiza a CoddyKit PRO. El curso de R Academy incluye 4 lecciones en total.

¿Qué aprenderé en «De formato ancho a largo con pivot_longer()»?

Reestructure tablas de formato ancho al formato largo ordenado para analizarlas. Practicas R Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar R Academy?

No se requiere experiencia previa. R Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «De formato ancho a largo con pivot_longer()»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de R Academy?

Sí. Cada lección de R Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. De formato ancho a largo con pivot_longer()
  2. De formato largo a ancho con pivot_wider()
  3. separate() y unite() para columnas de cadenas
  4. Anidación y desanidación de data frames
← Volver a R Academy