dplyr::percent_rank()パーセンタイルに基づいて各値をランク付けするように実装できます。dplyr::cume_dist()ただし、これは、累積分布関数(現在のランク以下のすべての値の割合) に基づいてランクを決定することとは異なります。
再現可能な例:
set.seed(1)
df <- data.frame(val = rnorm(n = 1000000, mean = 50, sd = 20))
percent_rank()とは異なり、cume_dist()とcume_dist()同じであることを示すecdf(x)(x):
library(tidyverse)
head(df) %>%
mutate(pr = percent_rank(val),
cd = ecdf(val)(val),
cd2 = cume_dist(val))
val pr cd cd2
1 37.47092 0.4 0.5000000 0.5000000
2 53.67287 0.6 0.6666667 0.6666667
3 33.28743 0.0 0.1666667 0.1666667
4 81.90562 1.0 1.0000000 1.0000000
5 56.59016 0.8 0.8333333 0.8333333
6 33.59063 0.2 0.3333333 0.3333333
このサンプル データセットの各アプローチの速度はほぼ同じで、2 倍を超えていません。
library(microbenchmark)
mbm <- microbenchmark(
pr_dplyr = mutate(df, pr = percent_rank(val)),
cd_dplyr = mutate(df, pr = percent_rank(val)),
cd_base = mutate(df, pr = ecdf(val)(val)),
times = 20
)
autoplot(mbm)
