0Pricing
R Academy · Lekcja

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żącym
  • cumsum() — suma narastająca; cumprod() — iloczyn narastający
  • cummax() / cummin() — maksimum / minimum narastające
  • row_number() — ranga będąca liczbą całkowitą wewnątrz grupy
  • ntile(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

  1. Podsumowania grupowane i group_by()
  2. Funkcje okna: lag, lead, cumsum
  3. Łączenie wielu tabel w dplyr
  4. Ewaluacja tidy: {{ }} i .data
← Powrót do R Academy