概要
dplyr
パッケージに含まれるrow_number(), min_rank(), dense_lank(), percent_rank(), cume_dist(), ntile()
は、値をランキングする関数です。主にmutate()
と併せて使用します。
関連ページ
関数
row_number(x)
min_rank(x)
dense_rank(x)
percent_rank(x)
cume_dist(x)
ntile(x = row_number(), n)
引数 | 指定 | 説明 |
---|---|---|
x | 必須 | 列名(ベクトル) 順序の基準となる列を指定します row_number() のみ未指定でも機能します |
n | 必須 | ntile() で使用する最大値を指定します |
使い方
解説用データフレーム
df <- tibble::tibble(
x1 = c(1, 2, 3, 3, 4),
)
> df
# A tibble: 5 x 1
x1
<dbl>
1 1
2 2
3 3
4 3
5 4
1.Base関数
dplyr
パッケージのランキング関数はrank()
をベースにして作られています。rank()
の挙動は以下の通りです。
# Base関数
mutate(df,
first = rank(x1, ties.method = 'first'),
min = rank(x1, ties.method = 'min'),
max = rank(x1, ties.method = 'max'))
# A tibble: 5 x 4
x1 first min max
<dbl> <dbl> <dbl> <dbl>
1 1 1 1 1
2 2 2 2 2
3 3 3 3 4
4 3 4 3 4
5 4 5 5 5
2.行番号の取得
# 行番号の取得
mutate(df, x2 = row_number())
# A tibble: 5 x 2
x1 x2
<dbl> <dbl>
1 1 1
2 2 2
3 3 3
4 3 4
5 4 5
3.ランク付け
以下のコードは、指定した列の値を昇順でランク付けする具体例です。降順でランク付けする場合は x1
の代わりに desc(x1)
と指定します。
3-1.重複なし
# ランキング関数
mutate(df, x2 = row_number(x1))
# 同じ結果を返すBase関数
mutate(df, x2 = rank(x1, ties.method = 'first'))
# A tibble: 5 x 2
x1 x2
<dbl> <dbl>
1 1 1
2 2 2
3 3 3
4 3 4
5 4 5
3-2.重複あり + 飛び番号あり
# ランキング関数
mutate(df, x2 = min_rank(x1))
# 同じ結果を返すBase関数
mutate(df, x2 = rank(x1, ties.method = 'min'))
# A tibble: 5 x 2
x1 x2
<dbl> <dbl>
1 1 1
2 2 2
3 3 3
4 3 3
5 4 5
3-3.重複あり + 飛び番号なし
mutate(df, x2 = dense_rank(x1))
# A tibble: 5 x 2
x1 x2
<dbl> <dbl>
1 1 1
2 2 2
3 3 3
4 3 3
5 4 4
3-4.正規化
# ランキング関数
mutate(df, x2 = percent_rank(x1))
# 同じ結果を返すBase関数
normalize <- function(x) ((x - min(x)) / (max(x) - min(x)))
mutate(df, x2 = normalize(rank(x1, ties.method = 'min')))
# A tibble: 5 x 2
x1 x2
<dbl> <dbl>
1 1 0.00
2 2 0.25
3 3 0.50
4 3 0.50
5 4 1.00
3-5.累積割合
# ランキング関数
mutate(df, x2 = cume_dist(x1))
# 同じ結果を返すBase関数
mutate(df, x2 = rank(x1, ties.method = 'max') / n())
# A tibble: 5 x 2
x1 x2
<dbl> <dbl>
1 1 0.2
2 2 0.4
3 3 0.8
4 3 0.8
5 4 1.0
3-6.範囲指定
# 範囲の最大値を10に設定する
mutate(df, x2 = ntile(x1, 10))
# 同じ結果を返すBase関数
mutate(df, x2 = lag(floor(rank(x1, ties.method = 'first') / n() * 10), default = 0) + 1)
# A tibble: 5 x 2
x1 x2
<dbl> <dbl>
1 1 1
2 2 3
3 3 5
4 3 7
5 4 9