我想模仿C#
(或某些僞代碼)中的Excel等效PERCENTILE函數。我怎樣才能做到這一點?函數應該有兩個參數,第一個是值列表,第二個是函數應該計算的百分位數。百分位數計算
坦克!
編輯:對不起,如果我的問題碰到像我沒有嘗試過我的自我。我無法理解excel函數是如何工作的(是的,我首先嚐試了wikipedia和wolfram),並且我認爲如果有人用代碼呈現它,我會更好地理解它。 @CodeInChaos給出了一個答案,這似乎是我所追求的。
我想模仿C#
(或某些僞代碼)中的Excel等效PERCENTILE函數。我怎樣才能做到這一點?函數應該有兩個參數,第一個是值列表,第二個是函數應該計算的百分位數。百分位數計算
坦克!
編輯:對不起,如果我的問題碰到像我沒有嘗試過我的自我。我無法理解excel函數是如何工作的(是的,我首先嚐試了wikipedia和wolfram),並且我認爲如果有人用代碼呈現它,我會更好地理解它。 @CodeInChaos給出了一個答案,這似乎是我所追求的。
我認爲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(所以我改變了評論的一個)。
@picknick:我剛寫過維基百科頁面的相應功能。這應該是Excel使用的(根據維基百科)。 – Marco
兩個問題:1)Excel似乎使用(N-1)方法2)它表示0到1之間的數字的百分位數。 – CodesInChaos
@CodeInChaos:感謝您的評論。我不知道Excel如何工作,我剛剛用C#翻譯了維基百科公式,假定與Excel有關的部分是正確的。你怎麼看?那些是錯的嗎?我認爲OP需要「一種方法」來計算百分比,即使有很多方法。無論如何,你的觀點對我來說很重要。讓我知道一些事情。謝謝! :) – Marco
試圖重現的結果: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
你可以給函數的用法,輸入數據的僞代碼示例和預期的輸出結果? – sll
[你有什麼嘗試?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – Justin