R Academy · レッスン

ウィンドウ関数:lag、lead、cumsum

グループ内で累計、オフセット、累積集計値を計算します。

レッスン 2/413 ステップ

「ウィンドウ関数:lag、lead、cumsum」はCoddyKit上の無料R Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。

ウィンドウ関数とは

ウィンドウ関数は、データをまとめずに現在の行を基準として値を計算します。summarize() とは異なり、すべての行を保持します。dplyr では、ウィンドウ関数を mutate() 内で使い、多くの場合 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() — 前の行の値

lag(x, n=1) は、現在の行より n 行前の値を返します。最初の 1 行(または複数行)は NA になります。期間ごとの変化を計算するのに適しています。

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() — 次の行の値

lead(x, n=1) は、現在の行より n 行先の値を返します。最後の 1 行(または複数行)は NA になります。現在の値を将来の値と比較するのに便利です。

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() と cumprod()

cumsum(x) は累積合計を計算します。cumprod(x) は累積積を計算します。どちらも base R の関数で、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() と cummin()

cummax(x) は、これまでに確認した値の最大値を追跡します。cummin(x) は累積最小値を追跡します。過去最高値・最低値の追跡やドローダウン分析に便利です。

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)
  )

row_number() による順位付け

row_number() は各行に整数の順位を割り当てます。group_by() の後に使うと、各グループ内で順位付けします。同順位の値には、登場順に連続した順位が割り当てられます。

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() — グループへの分割

ntile(x, n) はデータをほぼ同じ大きさの n 個のグループに分け、グループ番号を返します(1 = 最小)。四分位、十分位、パーセンタイルグループの作成に便利です。

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() — 相対的な位置

percent_rank(x) は、各値の順位を 0 から 1 の割合で返します。最小値は 0、最大値は 1 になります。他のすべての値と比べて、ある値がどの位置にあるかを示します。

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))

グループ内のウィンドウ関数

すべてのウィンドウ関数は、group_by() と組み合わせるとグループ対応になります。各グループには独立したウィンドウが設定されます。lag/lead はグループの境界を越えず、cumsum はグループごとにリセットされ、順位付けもグループ内で行われます。

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)
  )

複数のウィンドウ関数の組み合わせ

1 回の mutate() 呼び出しで複数のウィンドウ関数を連結し、分析用の列を豊富に作成できます。パイプラインが読みやすくなり、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)
  )

default 引数付きの lag()

lag(x, n=1, default=NA) は、最初の NA の位置を埋める default 値を受け取ります。計算列で欠損値ではなく数値の基準値が必要な場合に便利です。

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])
  )

クイックチェック

x の最小値に対して、ntile(x, 4) は何を返しますか?

まとめ: ウィンドウ関数

dplyr のウィンドウ関数に関する重要ポイント:

  • lag(x, n) — 現在の行より n 行前の値、lead(x, n) — n 行先の値
  • cumsum() — 累積合計、cumprod() — 累積積
  • cummax() / cummin() — 累積最大値 / 最小値
  • row_number() — グループ内の整数順位
  • ntile(x, n) — n 個のグループに分割(1 = 最小、n = 最大)
  • percent_rank(x) — 0 から 1 の範囲の割合による順位
  • すべてのウィンドウ関数は、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()
無料で開始

AI チューターと学ぶ R — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
43
レッスン
159

よくある質問

「ウィンドウ関数:lag、lead、cumsum」レッスンは無料ですか?

はい。「ウィンドウ関数:lag、lead、cumsum」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「ウィンドウ関数:lag、lead、cumsum」で何を学びますか?

グループ内で累計、オフセット、累積集計値を計算します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

R Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「ウィンドウ関数:lag、lead、cumsum」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このR Academyレッスンでコードを書いて実行できますか?

はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. グループ別集計とgroup_by()
  2. ウィンドウ関数:lag、lead、cumsum
  3. dplyrでの複数テーブル結合
  4. Tidy評価:{{ }}と.data
← R Academyに戻る