Funciones de ventana: lag, lead y cumsum
Calcule totales acumulados, desplazamientos y agregaciones acumulativas dentro de grupos.
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éscumsum()— total acumulado;cumprod()— producto acumuladocummax()/cummin()— máximo / mínimo acumuladorow_number()— clasificación entera dentro del grupontile(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()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
- Resúmenes agrupados y group_by()
- Funciones de ventana: lag, lead y cumsum
- Uniones entre varias tablas en dplyr
- Evaluación ordenada: {{ }} y .data