De formato ancho a largo con pivot_longer()
Reestructure tablas de formato ancho al formato largo ordenado para analizarlas.
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 principalcolsacepta tidyselect:starts_with(),-id_col,c('a','b')names_prefixelimina una cadena inicial de los nombres de las columnasnames_transformconvierte el tipo de la columna de nombres (por ejemplo, a entero)values_drop_na = TRUEelimina 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'
)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
- De formato ancho a largo con pivot_longer()
- De formato largo a ancho con pivot_wider()
- separate() y unite() para columnas de cadenas
- Anidación y desanidación de data frames