2016-12-11 8 views
1

この質問はStackOverflowの質問の拡張であり、hereと回答しました。データフレーム列のパーセンタイルを効率的に計算する

私の状況は、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) 

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

答えて

2

dplyr::percent_rankを実装して、パーセンタイルに基づいて各値のランク付けを行うことができます。

df.per <- df %>% 
    mutate(val.percentile = percent_rank(val)) 

編集

私は42 @この質問へのより良いオプションを持っていると信じています。 OPの関心事は、大規模なデータセットに関するものでした。 dplyr::percent_rankは非常に高速ですが、@ 42の答えはかなり速いです。

私は1,000,000行の数を増加させ、次のコードを実行しました:私の元の応答

df <- data.frame(val = rnorm(n = 1000000, mean = 50, sd = 20)) 

を:42の答え@

t <- proc.time() 
df <- df %>% 
    mutate(val.percentile = percent_rank(val)) 
proc.time() - t 


user system elapsed 
2.484 0.068 2.554 

t <- proc.time() 
df$val.percentile.2 <- ecdf(df$val)(df$val) 
proc.time() - t 


user system elapsed 
1.048 0.004 1.048 

だから、はっきりecdfは、指定されたコンテキストでより良い実行されます。 val.percentileval.percentile.2の結果は実質的に同じです。

4

ecdfは既にベクター化されているので、apply関数を使用する理由はありません。簡単に実行できます:

df$val.percentile <- ecdf(df$val)(df$val) 
+0

この回答はどのように私のものと異なっていましたか? –

+0

@ 42-それはないが、あなたとBarkerはほぼ同時に(Barkerが最初に)投稿した。 – Jaap

+0

私が投稿しているとき(または私の編集をしている時)、見なかった。私はそれが後で来たと仮定していた。 –

関連する問題