2

この質問は、ここで質問および回答された StackOverflow の質問の拡張です。

私の状況は、50,000 (またはそれ以上) の値のベクトル内の各値のパーセンタイルを計算したいという点で異なります。例えば ​​ -

df <- data.frame(val = rnorm(n = 50000, mean = 50, sd = 20))
df$val.percentile <- sapply(X = df$val, function(x) ecdf(df$val)(x))
head(df)

各値のパーセンタイルを計算するプロセスを最適化する良い方法はありますか? 基本的に、実行時間をできるだけ短くするために、できるだけ効率的にしたいと考えています。

4

2 に答える 2

3

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)

ここに画像の説明を入力

于 2016-12-11T14:33:42.803 に答える