De formato largo a ancho con pivot_wider()
Vuelva a distribuir pares clave-valor en tablas de formato ancho.
De formato largo a ancho con pivot_wider() es una lección gratuita de R Academy en CoddyKit. Esta es la lección 2 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.
Cuándo usar el formato ancho
Aunque el formato largo es adecuado para el análisis, a menudo se necesita el formato ancho para informes, hojas de cálculo y determinados algoritmos (por ejemplo, matrices de correlación). pivot_wider() es la inversa de pivot_longer(): distribuye los valores de una columna en varias columnas nuevas.
library(tidyr)
# Long format: one row per student-quarter combination
long_df <- data.frame(
student = c('Alice','Alice','Alice','Bob','Bob','Bob'),
quarter = c('Q1','Q2','Q3','Q1','Q2','Q3'),
score = c(85, 88, 92, 90, 85, 88)
)
print(long_df)
cat('\n', nrow(long_df), 'rows x', ncol(long_df), 'cols')Conceptos básicos de pivot_wider()
pivot_wider(df, names_from, values_from) convierte el formato largo en formato ancho. names_from especifica la columna cuyos valores se convierten en nombres de columnas nuevas; values_from especifica la columna cuyos valores rellenan esas columnas nuevas.
library(tidyr)
long_df <- data.frame(
student = c('Alice','Alice','Alice','Bob','Bob','Bob'),
quarter = c('Q1','Q2','Q3','Q1','Q2','Q3'),
score = c(85, 88, 92, 90, 85, 88)
)
wide_df <- pivot_wider(
long_df,
names_from = quarter,
values_from = score
)
print(wide_df)id_cols — Identificar las claves de las filas
id_cols especifica qué columnas identifican de forma única cada fila en la salida en formato ancho. De forma predeterminada, dplyr utiliza todas las columnas que no se hayan especificado en names_from o values_from. Establecerlo explícitamente evita agrupaciones inesperadas.
library(tidyr)
df <- data.frame(
year = c(2023,2023,2024,2024),
region = c('East','West','East','West'),
quarter = c('Q1','Q1','Q1','Q1'),
revenue = c(100, 200, 120, 220)
)
pivot_wider(
df,
id_cols = c(year, quarter),
names_from = region,
values_from = revenue
)values_fill — Gestión de combinaciones faltantes
Cuando no existen algunas combinaciones de id_cols y names_from, la celda resultante sería NA. Use values_fill para reemplazar esos valores faltantes por un valor predeterminado (por ejemplo, 0 para conteos o sumas).
library(tidyr)
df <- data.frame(
product = c('A','A','B'),
channel = c('online','store','online'),
sales = c(100, 150, 200)
)
# 'B' has no 'store' data — fill with 0
pivot_wider(
df,
names_from = channel,
values_from = sales,
values_fill = 0
)names_prefix — Agregar prefijos
Use names_prefix para anteponer una cadena a todos los nombres de las columnas nuevas. Esto evita problemas cuando los valores de names_from son números o cuando desea que los nombres de las columnas sean más descriptivos.
library(tidyr)
df <- data.frame(
student = c('Alice','Alice','Bob','Bob'),
quarter = c(1, 2, 1, 2),
score = c(85, 90, 78, 82)
)
# Without prefix: columns named '1' and '2' (problematic)
# With prefix: q1, q2
pivot_wider(
df,
names_from = quarter,
values_from = score,
names_prefix = 'q'
)Múltiples columnas en values_from
Puede cambiar la estructura de varias columnas de valores a la vez pasando un vector a values_from. Las columnas resultantes se nombran como value_name, combinando el nombre de la columna de valores y la categoría.
library(tidyr)
df <- data.frame(
region = c('East','East','West','West'),
period = c('Q1','Q2','Q1','Q2'),
revenue = c(100, 120, 200, 210),
units = c(10, 12, 20, 22)
)
pivot_wider(
df,
names_from = period,
values_from = c(revenue, units)
)Gestionar duplicados con values_fn
Si hay varios valores para la misma combinación de id + name, pivot_wider no sabe cuál usar y devuelve una columna de listas con una advertencia. Use values_fn para resolverlo especificando una función de agregación.
library(tidyr)
# Duplicate rows: Alice has two Q1 scores
df <- data.frame(
student = c('Alice','Alice','Alice','Bob','Bob'),
quarter = c('Q1','Q1','Q2','Q1','Q2'),
score = c(85, 87, 90, 78, 82)
)
# Resolve duplicates by taking the mean
pivot_wider(
df,
names_from = quarter,
values_from = score,
values_fn = mean
)values_fn con una lista con nombres
Pase una lista con nombres a values_fn para aplicar simultáneamente distintas funciones de agregación a diferentes columnas de valores. Esto resulta muy útil al cambiar la estructura de varias columnas de valores que requieren métodos de resumen diferentes.
library(tidyr)
df <- data.frame(
region = c('East','East','West','West'),
period = c('Q1','Q1','Q1','Q1'),
revenue = c(100, 120, 200, 210),
orders = c(10, 12, 20, 22)
)
pivot_wider(
df,
names_from = period,
values_from = c(revenue, orders),
values_fn = list(revenue = sum, orders = sum)
)Crear tablas de contingencia
Una tabla de contingencia en forma de data frame se crea fácilmente con pivot_wider() después de contar con dplyr::count(). Esto combina la potencia de ambos paquetes para el análisis de frecuencias.
library(tidyr)
library(dplyr)
survey <- data.frame(
dept = c('HR','HR','Eng','Eng','HR','Eng'),
response = c('Yes','No','Yes','Yes','Yes','No')
)
survey %>%
count(dept, response) %>%
pivot_wider(
names_from = response,
values_from = n,
values_fill = 0
)Ida y vuelta: larga -> ancha -> larga
Comprender la relación inversa entre pivot_longer() y pivot_wider() ayuda a detectar errores. Una conversión de ida y vuelta (long->wide->long) debería devolver los datos originales (salvo por el orden de las filas y las conversiones de tipo).
library(tidyr)
original_long <- data.frame(
id = c(1,1,2,2),
key = c('a','b','a','b'),
value = c(10, 20, 30, 40)
)
# Go wide
wide <- pivot_wider(original_long, names_from=key, values_from=value)
print(wide)
# Go long again
pivot_longer(wide, -id, names_to='key', values_to='value')Práctica: informe de calificaciones
Un caso de uso habitual: tomar una tabla larga de calificaciones de exámenes y transformarla en una tabla de informe con un estudiante por fila y una asignatura por columna. Combine esto con dplyr::arrange() y rename() para generar un resultado limpio y listo para presentar.
library(tidyr)
library(dplyr)
scores <- data.frame(
student = c('Alice','Alice','Bob','Bob','Carol','Carol'),
subject = c('Math','Science','Math','Science','Math','Science'),
score = c(92, 88, 85, 91, 79, 83)
)
scores %>%
pivot_wider(names_from=subject, values_from=score) %>%
mutate(average = round((Math + Science) / 2, 1)) %>%
arrange(desc(average))Comprobación rápida
¿Qué ocurre cuando llama a pivot_wider() y hay varios valores para la misma combinación de id + name?
Repaso: pivot_wider()
Conceptos clave para convertir datos de formato largo a ancho:
pivot_wider(names_from, values_from)convierte una columna clave en varias columnas nuevasid_colsespecifica qué columnas identifican cada filavalues_fill = 0(o cualquier escalar) completa las combinaciones faltantesnames_prefixantepone una cadena para evitar nombres de columnas numéricos o ambiguosvalues_fnresuelve los valores duplicados de una celda mediante una función de agregación- Pase un vector a
values_frompara cambiar simultáneamente la estructura de varias columnas de valores - Úselo después de
count()para crear tablas de contingencia de forma eficaz
library(tidyr)
library(dplyr)
data.frame(
region = c('East','East','West','West'),
metric = c('revenue','units','revenue','units'),
value = c(100, 10, 200, 20)
) %>%
pivot_wider(
names_from = metric,
values_from = value,
values_fill = 0
) %>%
mutate(revenue_per_unit = revenue / units)Preguntas frecuentes
¿La lección «De formato largo a ancho con pivot_wider()» es gratis?
Sí — el texto completo de «De formato largo a ancho con pivot_wider()» 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 largo a ancho con pivot_wider()»?
Vuelva a distribuir pares clave-valor en tablas de formato ancho. 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 2 de 4.
¿Cuánto tiempo toma la lección «De formato largo a ancho con pivot_wider()»?
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