C#
(またはいくつかの疑似コード)でExcelの同等のPERCENTILE関数を模倣したいと思います。どうやってやるの?関数は2つの引数を取る必要があります。最初の引数は値のリストで、2番目の引数は関数が計算するパーセンタイルです。
戦車!
編集:自分で試したことがなかったように私の質問が出てきたとしたら、ごめんなさい。私は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の間のパーセンタイル値を使用し(したがって、コードを変更してこれをWikipediaの数式で実装します)、他の方法でnを計算します(コメントを変更しました)。
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
リストに値を追加し、そのリストをソートして、インデックス値ceil(リストの長さ*パーセンタイル)を取得します。