R Academy · Lección

Funciones de ventana: lag, lead y cumsum

Calcule totales acumulados, desplazamientos y agregaciones acumulativas dentro de grupos.

Lección 2 de 413 pasos

Funciones de ventana: lag, lead y cumsum 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.

¿Qué son las funciones de ventana?

Las funciones de ventana calculan valores relativos a la fila actual sin reducir los datos. A diferencia de summarize(), conservan todas las filas. En dplyr, las funciones de ventana se utilizan dentro de mutate(), a menudo después de group_by().

library(dplyr)

# Monthly revenue — we want to compare each month to previous
df <- data.frame(
  month = 1:6,
  revenue = c(100, 120, 95, 140, 160, 130)
)
print(df)

lag() — Valor de la fila anterior

lag(x, n=1) devuelve el valor de n filas anteriores a la fila actual. La primera o primeras filas tendrán el valor NA. Es ideal para calcular cambios entre periodos.

library(dplyr)

df <- data.frame(
  month = 1:6,
  revenue = c(100, 120, 95, 140, 160, 130)
)

df %>%
  mutate(
    prev_revenue = lag(revenue),
    change = revenue - lag(revenue),
    pct_change = round(100 * (revenue - lag(revenue)) / lag(revenue), 1)
  )

lead() — Valor de la fila siguiente

lead(x, n=1) devuelve el valor de n filas posteriores a la fila actual. La última o últimas filas tendrán el valor NA. Resulta útil para calcular cómo se compara el valor actual con los valores futuros.

library(dplyr)

df <- data.frame(
  month = 1:5,
  revenue = c(100, 120, 95, 140, 160)
)

df %>%
  mutate(
    next_month = lead(revenue),
    next_2_months = lead(revenue, n = 2),
    will_increase = revenue < lead(revenue)
  )

cumsum() y cumprod()

cumsum(x) calcula un total acumulado (suma acumulada). cumprod(x) calcula el producto acumulado. Ambas son funciones de R base que funcionan perfectamente dentro de mutate().

library(dplyr)

df <- data.frame(
  month = 1:6,
  revenue = c(100, 120, 95, 140, 160, 130)
)

df %>%
  mutate(
    running_total = cumsum(revenue),
    growth_factor = round(cumprod(1 + (revenue - 100) / 100), 3)
  )

cummax() y cummin()

cummax(x) realiza un seguimiento del máximo acumulado, es decir, el valor más alto observado hasta el momento. cummin(x) realiza un seguimiento del mínimo acumulado. Son útiles para seguir máximos y mínimos históricos y analizar las caídas.

library(dplyr)

df <- data.frame(
  day = 1:7,
  price = c(50, 52, 48, 55, 53, 58, 56)
)

df %>%
  mutate(
    all_time_high = cummax(price),
    all_time_low = cummin(price),
    drawdown_from_high = price - cummax(price)
  )

Clasificación con row_number()

row_number() asigna una clasificación entera a cada fila. Cuando se utiliza después de group_by(), clasifica dentro de cada grupo. Los empates reciben clasificaciones consecutivas según su orden de aparición.

library(dplyr)

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

sales %>%
  group_by(region) %>%
  mutate(rank = row_number(desc(revenue))) %>%
  arrange(region, rank)

ntile() — Dividir en grupos

ntile(x, n) divide los datos en n grupos de tamaño aproximadamente igual y devuelve el número del grupo (1 = el más bajo). Resulta útil para crear cuartiles, deciles o grupos percentiles.

library(dplyr)

df <- data.frame(
  customer = paste0('C', 1:10),
  spend = c(50, 200, 75, 300, 125, 450, 25, 175, 100, 350)
)

df %>%
  mutate(
    quartile = ntile(spend, 4),
    decile = ntile(spend, 10)
  ) %>%
  arrange(spend)

percent_rank() — Posición relativa

percent_rank(x) devuelve la clasificación de cada valor como una proporción entre 0 y 1. El mínimo obtiene 0 y el máximo obtiene 1. Indica dónde se sitúa un valor con respecto a todos los demás.

library(dplyr)

df <- data.frame(
  student = c('Alice','Bob','Carol','Dave','Eve'),
  score = c(85, 92, 78, 95, 88)
)

df %>%
  mutate(
    pct_rank = round(percent_rank(score), 3),
    top_pct = round(1 - percent_rank(score), 3)
  ) %>%
  arrange(desc(score))

Funciones de ventana en grupos

Todas las funciones de ventana tienen en cuenta los grupos cuando se combinan con group_by(). Cada grupo obtiene su propia ventana independiente: lag/lead no atraviesan los límites entre grupos, cumsum se reinicia en cada grupo y las clasificaciones se realizan dentro del grupo.

library(dplyr)

df <- data.frame(
  product = c('A','A','A','B','B','B'),
  month = c(1,2,3,1,2,3),
  sales = c(100, 120, 110, 200, 180, 220)
)

df %>%
  group_by(product) %>%
  mutate(
    mom_change = sales - lag(sales),
    cumulative = cumsum(sales),
    rank_in_product = row_number(sales)
  )

Combinar varias funciones de ventana

Puede encadenar varias funciones de ventana en una sola llamada a mutate() para crear columnas analíticas completas. Esto mantiene la legibilidad del flujo de trabajo y evita repetir llamadas a group_by().

library(dplyr)

stock <- data.frame(
  date = as.Date(c('2024-01-01','2024-01-02','2024-01-03',
                   '2024-01-04','2024-01-05')),
  close = c(150.2, 152.8, 149.5, 155.1, 157.3)
)

stock %>%
  mutate(
    prev_close = lag(close),
    daily_return = round((close / lag(close) - 1) * 100, 2),
    running_high = cummax(close),
    distance_from_high = round(close - cummax(close), 2)
  )

lag() con el argumento default

lag(x, n=1, default=NA) acepta un valor default para rellenar las posiciones iniciales con NA. Esto resulta útil cuando necesita una referencia numérica en lugar de valores ausentes en las columnas calculadas.

library(dplyr)

df <- data.frame(
  week = 1:5,
  visitors = c(500, 620, 480, 700, 650)
)

df %>%
  mutate(
    prev_week = lag(visitors, default = 0),
    growth = visitors - lag(visitors, default = visitors[1])
  )

Comprobación rápida

¿Qué devuelve ntile(x, 4) para el valor mínimo de x?

Recapitulación: funciones de ventana

Conclusiones clave sobre las funciones de ventana en dplyr:

  • lag(x, n) — valor situado n filas antes de la actual; lead(x, n) — valor situado n filas después
  • cumsum() — total acumulado; cumprod() — producto acumulado
  • cummax() / cummin() — máximo / mínimo acumulado
  • row_number() — clasificación entera dentro del grupo
  • ntile(x, n) — dividir en n grupos (1 = el más bajo, n = el más alto)
  • percent_rank(x) — clasificación fraccionaria entre 0 y 1
  • Todas las funciones de ventana tienen en cuenta los grupos cuando se combinan con group_by()
library(dplyr)

# Comprehensive window function example
data.frame(
  region = c('East','East','East','West','West','West'),
  month = c(1,2,3,1,2,3),
  sales = c(100, 130, 120, 200, 190, 210)
) %>%
  group_by(region) %>%
  mutate(
    mom_chg = sales - lag(sales),
    running_total = cumsum(sales),
    rank = row_number(desc(sales))
  ) %>%
  ungroup()
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 «Funciones de ventana: lag, lead y cumsum» es gratis?

Sí — el texto completo de «Funciones de ventana: lag, lead y cumsum» 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 «Funciones de ventana: lag, lead y cumsum»?

Calcule totales acumulados, desplazamientos y agregaciones acumulativas dentro de grupos. 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 «Funciones de ventana: lag, lead y cumsum»?

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