2011-11-15 115 views
17

我想模仿C#(或某些僞代碼)中的Excel等效PERCENTILE函數。我怎樣才能做到這一點?函數應該有兩個參數,第一個是值列表,第二個是函數應該計算的百分位數。百分位數計算

坦克!

編輯:對不起,如果我的問題碰到像我沒有嘗試過我的自我。我無法理解excel函數是如何工作的(是的,我首先嚐試了wikipedia和wolfram),並且我認爲如果有人用代碼呈現它,我會更好地理解它。 @CodeInChaos給出了一個答案,這似乎是我所追求的。

+0

你可以給函數的用法,輸入數據的僞代碼示例和預期的輸出結果? – sll

+5

[你有什麼嘗試?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – Justin

回答

26

我認爲Wikipedia page有你需要編寫自己的函數公式...
我嘗試這樣做:

public double Percentile(double[] sequence, double excelPercentile) 
{ 
    Array.Sort(sequence); 
    int N = sequence.Length; 
    double n = (N - 1) * excelPercentile + 1; 
    // Another method: double n = (N + 1) * excelPercentile; 
    if (n == 1d) return sequence[0]; 
    else if (n == N) return sequence[N - 1]; 
    else 
    { 
     int k = (int)n; 
     double d = n - k; 
     return sequence[k - 1] + d * (sequence[k] - sequence[k - 1]); 
    } 
} 

CodeInChaos評論後編輯:
Excel使用0和1之間的百分位值(所以我改變了我的代碼來實現這個維基百科公式)和另一種方法來調用n(所以我改變了評論的一個)。

+0

@picknick:我剛寫過維基百科頁面的相應功能。這應該是Excel使用的(根據維基百科)。 – Marco

+0

兩個問題:1)Excel似乎使用(N-1)方法2)它表示0到1之間的數字的百分位數。 – CodesInChaos

+0

@CodeInChaos:感謝您的評論。我不知道Excel如何工作,我剛剛用C#翻譯了維基百科公式,假定與Excel有關的部分是正確的。你怎麼看?那些是錯的嗎?我認爲OP需要「一種方法」來計算百分比,即使有很多方法。無論如何,你的觀點對我來說很重要。讓我知道一些事情。謝謝! :) – Marco

1

將值添加到列表中,對該列表進行排序,並獲取索引值ceil(列表長度*百分比)。

+2

這不符合Excel的百分位數函數。它似乎使用最接近的值之間的線性插值。 – CodesInChaos

11

試圖重現的結果:http://www.techonthenet.com/excel/formulas/percentile.php我想出了:

public static double Percentile(IEnumerable<double> seq,double percentile) 
{ 
    var elements=seq.ToArray(); 
    Array.Sort(elements); 
    double realIndex=percentile*(elements.Length-1); 
    int index=(int)realIndex; 
    double frac=realIndex-index; 
    if(index+1<elements.Length) 
     return elements[index]*(1-frac)+elements[index+1]*frac; 
    else 
     return elements[index]; 
} 

(不處理NaN和無窮大)。

一些測試情況:

Percentile(new double[]{1,2,3,4}, 0.8).Dump();// 3.4 
Percentile(new double[]{7,8,9,20}, 0.35).Dump();// 8.05 
Percentile(new double[]{1,2,3,4}, 0.3).Dump();// 1.9