使用 LINQ 计算百分位数

sha*_*sen 5 c# linq percentile

全部,

回顾了 StackOverflow 和更广泛的互联网后,我仍在努力使用 LINQ有效地计算百分位数。

其中百分位数是统计中使用的一种度量,表示一组观察中给定百分比的观察低于该值。下面的示例尝试将值列表转换为数组,其中每个(唯一的)值都用关联的百分位数表示。列表的 min() 和 max() 必须是返回数组百分位数的 0% 和 100%。

使用LINQPad,以下代码生成所需的输出 VP[]:

在此处输入图片说明

这可以解释为: - 在 0% 时,最小值为 1 - 在 100% 时,最大值为 3 - 在最小值和最大值之间的 50% 时,值为 2

void Main()
{
    var list = new List<double> {1,2,3};
    double denominator = list.Count - 1;   
    var answer = list.Select(x => new VP
        {
            Value = x,
            Percentile = list.Count(y => x > y) / denominator
        })
        //.GroupBy(grp => grp.Value) --> commented out until attempted duplicate solution 
        .ToArray();
    answer.Dump();
}

public struct VP
{
    public double Value;
    public double Percentile;
}
Run Code Online (Sandbox Code Playgroud)

但是,当“列表”包含重复条目(例如 1,2,**2,**3)时,这将返回不正确的 VP[] :

在此处输入图片说明

我尝试按列表中的唯一值分组(通过包括“.GroupBy(grp => grp.Value)”)未能产生所需的结果 (Value =2, & Percentile = 0.666):

在此处输入图片说明

欢迎提出所有建议。包括考虑到“list.Count(y => x > y)”的重复迭代,这是否是一种有效的方法。

一如既往,谢谢香农

小智 0

我就是这样做的。我更改了一些变量名称以使上下文更清晰。

var dataSet = new List<double> { 1, 2, 3, 2 };
double denominator = dataSet.Count - 1;
var uniqueValues = dataSet.Distinct();
var vp = dataSet.Select(value => new VP
{
    Value = value,
    Proportion = dataSet.Count(datum => value > datum) / denominator
});

var answer = uniqueValues.Select(u => new VP{
    Value = u,
    Proportion = vp.Where(v => v.Value == u).Select(x => x.Proportion).Sum()
});
Run Code Online (Sandbox Code Playgroud)

  • 看来效率极低。`Count(datum =&gt; value &gt; datum)` 将一遍又一遍地迭代整个集合。 (2认同)