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)
| 归档时间: |
|
| 查看次数: |
7150 次 |
| 最近记录: |