Funkcje okna: lag, lead, cumsum
Obliczaj sumy narastające, przesunięcia i agregaty skumulowane w obrębie grup.
Funkcje okna: lag, lead, cumsum to bezpłatna lekcja R Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.
Czym są funkcje okna?
Funkcje okna obliczają wartości względem bieżącego wiersza, nie redukując danych. W przeciwieństwie do summarize() zachowują wszystkie wiersze. W dplyr funkcji okna używa się wewnątrz mutate() — często po 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() — wartość poprzedniego wiersza
lag(x, n=1) zwraca wartość znajdującą się n wierszy przed bieżącym wierszem. Dla pierwszego wiersza lub pierwszych wierszy zostanie zwrócone NA. Funkcja idealnie nadaje się do obliczania zmian między kolejnymi okresami.
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() — wartość następnego wiersza
lead(x, n=1) zwraca wartość znajdującą się n wierszy za bieżącym wierszem. Dla ostatniego wiersza lub ostatnich wierszy zostanie zwrócone NA. Funkcja jest przydatna do obliczania, jak bieżąca wartość wypada w porównaniu z przyszłymi wartościami.
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() i cumprod()
cumsum(x) oblicza sumę narastającą. cumprod(x) oblicza iloczyn narastający. Obie funkcje należą do bazowego R i bezproblemowo działają wewnątrz 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() i cummin()
cummax(x) śledzi maksimum narastające — najwyższą dotychczas zaobserwowaną wartość. cummin(x) śledzi minimum narastające. Funkcje te są przydatne do śledzenia historycznych maksimów i minimów oraz analizy obsunięć.
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)
)Ranking za pomocą row_number()
row_number() przypisuje każdemu wierszowi rangę będącą liczbą całkowitą. Użyta po group_by() tworzy ranking wewnątrz każdej grupy. Wartości remisowe otrzymują kolejne rangi zgodnie z kolejnością występowania.
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() — dzielenie na grupy
ntile(x, n) dzieli dane na n grup o zbliżonej liczebności i zwraca numer grupy (1 = najniższe wartości). Funkcja jest przydatna do tworzenia kwartylów, decyli lub grup percentylowych.
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() — pozycja względna
percent_rank(x) zwraca rangę każdej wartości jako proporcję od 0 do 1. Minimum otrzymuje 0, a maksimum 1. Informuje, gdzie dana wartość znajduje się na tle wszystkich pozostałych.
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))Funkcje okna w grupach
Wszystkie funkcje okna stają się świadome grup, gdy połączy się je z group_by(). Każda grupa otrzymuje własne, niezależne okno — lag/lead nie przekraczają granic grup, cumsum jest resetowane dla każdej grupy, a rankingi są tworzone wewnątrz grup.
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)
)Łączenie wielu funkcji okna
W jednym wywołaniu mutate() możesz połączyć wiele funkcji okna, aby utworzyć rozbudowane kolumny analityczne. Dzięki temu potok pozostaje czytelny i unikasz wielokrotnego wywoływania 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() z argumentem default
lag(x, n=1, default=NA) przyjmuje wartość default, która wypełnia początkowe pozycje NA. Jest to przydatne, gdy w obliczanych kolumnach potrzebujesz liczbowej wartości bazowej zamiast brakujących wartości.
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])
)Szybki test
Co zwraca ntile(x, 4) dla minimalnej wartości w x?
Podsumowanie: funkcje okna
Najważniejsze informacje o funkcjach okna w dplyr:
lag(x, n)— wartość n wierszy przed bieżącym;lead(x, n)— wartość n wierszy za bieżącymcumsum()— suma narastająca;cumprod()— iloczyn narastającycummax()/cummin()— maksimum / minimum narastającerow_number()— ranga będąca liczbą całkowitą wewnątrz grupyntile(x, n)— podział na n grup (1 = najniższa, n = najwyższa)percent_rank(x)— ranga ułamkowa od 0 do 1- Wszystkie funkcje okna uwzględniają grupy, gdy są używane razem z
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()Często zadawane pytania
Czy lekcja „Funkcje okna: lag, lead, cumsum” jest bezpłatna?
Tak — pełny tekst „Funkcje okna: lag, lead, cumsum” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Funkcje okna: lag, lead, cumsum”?
Obliczaj sumy narastające, przesunięcia i agregaty skumulowane w obrębie grup. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć R Academy?
Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Funkcje okna: lag, lead, cumsum”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?
Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podsumowania grupowane i group_by()
- Funkcje okna: lag, lead, cumsum
- Łączenie wielu tabel w dplyr
- Ewaluacja tidy: {{ }} i .data