【发布时间】:2015-02-25 06:43:01
【问题描述】:
全部,
查看了 StackOverflow 和更广泛的互联网后,我仍在努力有效地使用 LINQ 计算百分位数。
percentile 是统计中使用的度量,表示一组观察值中给定百分比的观察值低于该值。下面的示例尝试将值列表转换为一个数组,其中每个(唯一)值表示为关联的百分位数。 列表的 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;
}
但是,当“列表”包含重复条目(例如 1,2,**2,**3)时,这会返回不正确的 VP[]:
我尝试按列表中的唯一值分组(通过包括“.GroupBy(grp => grp.Value)”)未能产生预期的结果(值 =2,百分位数 = 0.666):
欢迎所有建议。包括考虑到“list.Count(y => x > y)”的重复迭代,这是否是一种有效的方法。
一如既往,谢谢 香农
【问题讨论】:
-
我不清楚你到底想计算什么,也许我的数学有点生疏……你能告诉我你所说的比例/百分位数是什么意思吗?与分母有关。谢谢
-
为什么要用list.Count()来计算分母?目前还不清楚您要完成什么。
-
@TheCatWhisperer 对于原始列表中的每个元素(即 1,2,3)我需要值和百分位数(例如 value = 2 标记分布的 50% 点。我正在组装一个概率各种密度函数。可以快速引用 VP[] 来确定 50% 的元素小于或等于“2”。
-
百分位数是如何分布的?通常,学生,等等?
-
如果您重新表述您的问题并包含列表代表什么以及价值和比例是什么的定义,这将非常有帮助。
标签: c# linq percentile