ウィンドウ関数:lag、lead、cumsum
グループ内で累計、オフセット、累積集計値を計算します。
「ウィンドウ関数: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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- グループ別集計とgroup_by()
- ウィンドウ関数:lag、lead、cumsum
- dplyrでの複数テーブル結合
- Tidy評価:{{ }}と.data