0Pricing
R Academy · Lección

Resúmenes agrupados y group_by()

Agregue datos por grupos y calcule estadísticas para cada grupo.

Resúmenes agrupados y group_by() 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.

¿Por qué agrupar datos?

Agrupar datos es una de las operaciones más potentes del análisis de datos. En lugar de calcular estadísticas sobre un conjunto de datos completo, las calcula dentro de cada grupo. El paquete dplyr lo facilita mediante group_by(), seguido de summarize().

library(dplyr)

# Sample sales data
sales <- data.frame(
  region = c('North','North','South','South','East'),
  revenue = c(120, 95, 200, 175, 88),
  units = c(10, 8, 15, 12, 7)
)

print(sales)

Conceptos básicos de group_by()

group_by(col) marca un data frame para que las operaciones posteriores se realicen por grupo. No cambia los datos; añade metadatos de agrupación. Puede agrupar por una o varias columnas.

library(dplyr)

sales <- data.frame(
  region = c('North','North','South','South','East'),
  revenue = c(120, 95, 200, 175, 88),
  units = c(10, 8, 15, 12, 7)
)

# Group by region
grouped <- sales %>% group_by(region)
print(grouped)
print(group_keys(grouped))

summarize() después de group_by()

summarize() (o summarise()) reduce cada grupo a una sola fila. Especifique los nombres de las nuevas columnas y las funciones de resumen que se aplicarán. Funciones habituales: n(), mean(), sum(), min(), max().

library(dplyr)

sales <- data.frame(
  region = c('North','North','South','South','East'),
  revenue = c(120, 95, 200, 175, 88),
  units = c(10, 8, 15, 12, 7)
)

sales %>%
  group_by(region) %>%
  summarize(
    n = n(),
    mean_revenue = mean(revenue),
    total_units = sum(units)
  )

Contar con n()

n() dentro de summarize() devuelve el número de filas de cada grupo. No requiere argumentos. Para contar las filas que cumplen una condición, use sum(condition). n_distinct(col) cuenta los valores únicos.

library(dplyr)

employees <- data.frame(
  dept = c('HR','HR','Eng','Eng','Eng','Sales'),
  salary = c(55000, 60000, 95000, 105000, 90000, 70000),
  senior = c(FALSE, TRUE, TRUE, TRUE, FALSE, FALSE)
)

employees %>%
  group_by(dept) %>%
  summarize(
    count = n(),
    senior_count = sum(senior),
    avg_salary = mean(salary)
  )

Agrupar por varias columnas

Puede pasar varias columnas a group_by(). Los grupos se forman a partir de cada combinación de valores presente en los datos. Esto resulta útil para crear tablas de contingencia y resúmenes jerárquicos.

library(dplyr)

orders <- data.frame(
  region = c('North','North','South','South','North','South'),
  product = c('A','B','A','B','A','A'),
  sales = c(100, 200, 150, 250, 120, 180)
)

orders %>%
  group_by(region, product) %>%
  summarize(
    total_sales = sum(sales),
    orders = n(),
    .groups = 'drop'
  )

El argumento .groups

Después de summarize(), el resultado sigue agrupado por todas las variables de agrupación excepto la última. El argumento .groups controla este comportamiento:

  • 'drop_last' — opción predeterminada; elimina el último nivel de agrupación
  • 'drop' — elimina toda la agrupación
  • 'keep' — conserva toda la agrupación
library(dplyr)

df <- data.frame(
  year = c(2022,2022,2023,2023),
  quarter = c('Q1','Q2','Q1','Q2'),
  revenue = c(100, 120, 130, 150)
)

# .groups = 'drop' ensures ungrouped result
result <- df %>%
  group_by(year, quarter) %>%
  summarize(total = sum(revenue), .groups = 'drop')

print(result)
print(is.grouped_df(result))  # FALSE

ungroup() de forma explícita

Siempre puede llamar a ungroup() para eliminar los metadatos de agrupación de un data frame. Esto es importante cuando quiere que las operaciones posteriores actúen sobre el conjunto de datos completo y no por grupo.

library(dplyr)

df <- data.frame(
  dept = c('HR','HR','Eng','Eng'),
  salary = c(55000, 60000, 95000, 105000)
)

# Without ungroup: rank is within group
df %>%
  group_by(dept) %>%
  mutate(rank_in_dept = rank(salary)) %>%
  ungroup() %>%
  mutate(rank_overall = rank(salary))

group_keys() y n_groups()

group_keys() devuelve un data frame que muestra las combinaciones de grupos únicas. n_groups() indica cuántos grupos existen. Estas funciones resultan útiles para inspeccionar los grupos antes de realizar operaciones agrupadas.

library(dplyr)

df <- data.frame(
  country = c('US','US','UK','UK','DE'),
  category = c('A','B','A','A','B'),
  value = c(10, 20, 15, 25, 30)
)

grouped <- df %>% group_by(country, category)

cat('Number of groups:', n_groups(grouped), '\n')
print(group_keys(grouped))

Resumir con varias estadísticas

Puede calcular muchas estadísticas de resumen en una sola llamada a summarize(). Combine en una misma operación el recuento, la media, la mediana, la desviación estándar, los valores mínimo y máximo, y cálculos personalizados.

library(dplyr)

scores <- data.frame(
  class = c('A','A','A','B','B','B','C','C'),
  score = c(85, 90, 78, 92, 88, 95, 70, 75)
)

scores %>%
  group_by(class) %>%
  summarize(
    n = n(),
    mean_score = round(mean(score), 1),
    median_score = median(score),
    sd_score = round(sd(score), 2),
    min_score = min(score),
    max_score = max(score)
  )

mutate() consciente de los grupos

mutate() después de group_by() calcula valores dentro de cada grupo, pero conserva todas las filas (a diferencia de summarize()). Es perfecto para calcular métricas de nivel de grupo que quiera asociar a cada fila.

library(dplyr)

sales <- data.frame(
  region = c('East','East','West','West','West'),
  rep = c('Alice','Bob','Carol','Dave','Eve'),
  revenue = c(150, 200, 120, 180, 160)
)

sales %>%
  group_by(region) %>%
  mutate(
    region_total = sum(revenue),
    pct_of_region = round(100 * revenue / sum(revenue), 1)
  ) %>%
  ungroup()

Filtrar dentro de los grupos

filter() después de group_by() filtra las filas según condiciones de nivel de grupo. Por ejemplo, puede conservar solo el mejor resultado de cada región o las filas cuyo valor supere la media del grupo.

library(dplyr)

sales <- data.frame(
  region = c('East','East','West','West','North','North'),
  rep = c('Alice','Bob','Carol','Dave','Eve','Frank'),
  revenue = c(150, 200, 120, 180, 95, 130)
)

# Keep the top rep per region
sales %>%
  group_by(region) %>%
  filter(revenue == max(revenue)) %>%
  ungroup()

Comprobación rápida

¿Qué hace el argumento .groups = 'drop' en summarize()?

Recapitulación: resúmenes agrupados

Conclusiones clave de los resúmenes agrupados:

  • group_by(col) añade agrupación: los datos no cambian, pero las operaciones tienen en cuenta los grupos
  • summarize() reduce cada grupo a una fila; use n(), mean(), sum(), etc.
  • .groups = 'drop' garantiza que el resultado no esté agrupado
  • ungroup() elimina la agrupación en cualquier momento
  • group_keys() inspecciona los niveles de agrupación; n_groups() los cuenta
  • mutate() + group_by() añade columnas de nivel de grupo sin reducir las filas
library(dplyr)

# Full pipeline example
data.frame(
  dept = c('Eng','Eng','HR','HR','Sales'),
  salary = c(95000, 110000, 60000, 65000, 75000)
) %>%
  group_by(dept) %>%
  summarize(
    headcount = n(),
    avg_salary = mean(salary),
    .groups = 'drop'
  ) %>%
  arrange(desc(avg_salary))

Preguntas frecuentes

¿La lección «Resúmenes agrupados y group_by()» es gratis?

Sí — el texto completo de «Resúmenes agrupados y group_by()» 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 «Resúmenes agrupados y group_by()»?

Agregue datos por grupos y calcule estadísticas para cada grupo. 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 «Resúmenes agrupados y group_by()»?

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. Resúmenes agrupados y group_by()
  2. Funciones de ventana: lag, lead y cumsum
  3. Uniones entre varias tablas en dplyr
  4. Evaluación ordenada: {{ }} y .data
← Volver a R Academy