2011-11-15 49 views
17

Tôi muốn bắt chước hàm PERCENTILE tương đương với Excel trong C# (hoặc trong một số mã giả). Làm thế nào tôi có thể làm điều đó? Hàm nên lấy hai đối số trong đó đầu tiên là danh sách các giá trị và giá trị thứ hai là số phần trăm mà hàm cần tính toán.Tính toán phần trăm

Xe tăng!

Chỉnh sửa: Tôi xin lỗi nếu câu hỏi của tôi xuất hiện như tôi đã không tự mình thử. Tôi chỉ không thể hiểu được chức năng excel hoạt động như thế nào (vâng, tôi đã thử wikipedia và wolfram trước) và tôi nghĩ tôi sẽ hiểu nó tốt hơn nếu ai đó trình bày nó trong mã. @CodeInChaos đưa ra một câu trả lời dường như là những gì tôi theo sau.

+0

bạn có thể cho một ví dụ giả của việc sử dụng chức năng, dữ liệu đầu vào và kết quả đầu ra mong đợi? – sll

+5

[Bạn đã thử gì?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) – Justin

Trả lời

26

Tôi nghĩ Wikipedia page có công thức bạn cần phải viết chức năng riêng của bạn ...
Tôi cố gắng này:

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]); 
    } 
} 

EDITED sau CodeInChaos bình luận:
Excel sử dụng một giá trị phần trăm giữa 0 và 1 (vì vậy tôi đã thay đổi mã của mình để thực hiện điều này bằng công thức Wikipedia) và phương thức khác để tính toán n (vì vậy tôi đã thay đổi phương thức nhận xét).

+0

@picknick: Tôi vừa viết chức năng tương ứng từ trang Wikipedia. Điều này nên được sử dụng (theo Wikipedia) bởi Excel. – Marco

+0

Hai vấn đề: 1) Excel dường như sử dụng phương pháp (N-1) 2) Nó đại diện cho phần trăm theo số từ 0 đến 1. – CodesInChaos

+0

@CodeInChaos: cảm ơn nhận xét của bạn. Tôi không biết Excel hoạt động như thế nào, tôi vừa dịch các công thức Wikipedia trong C#, giả định rằng phần liên quan đến Excel là chính xác. Bạn nghĩ sao? Là những người sai? Tôi nghĩ rằng OP cần thiết _ "một cách" _ để calc percentile, ngay cả bởi vì có rất nhiều phương pháp. Dù sao quan điểm của bạn cũng quan trọng đối với tôi. Hãy cho tôi biết điều gì đó. Cảm ơn! :) – Marco

1

Thêm giá trị vào danh sách, sắp xếp danh sách đó và lấy giá trị chỉ số ceil (chiều dài của danh sách * phần trăm).

+2

Điều đó không phù hợp với chức năng Phần trăm của Excel. Dường như sử dụng phép nội suy tuyến tính giữa các giá trị gần nhất. – CodesInChaos

11

Đang cố gắng để tạo lại kết quả tại địa chỉ: http://www.techonthenet.com/excel/formulas/percentile.php tôi đến với:

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]; 
} 

(Không xử lý NaN và infinities).

Một vài trường hợp thử nghiệm:

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 
Các vấn đề liên quan