2016-12-11 91 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)) 

我原來的迴應:

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


user system elapsed 
2.484 0.068 2.554 

@ 42的回答是:

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-它不是,但你和巴克幾乎同時發佈(巴克是第一個) – Jaap

+0

呵呵,當我發佈(或正在做我的編輯)時沒有看到它。我假設它遲到了。 –