代码之家  ›  专栏  ›  技术社区  ›  Daniel Nicolay

计算可以是中性的特定数据的平均值

  •  1
  • Daniel Nicolay  · 技术社区  · 8 年前

    我搜索了平均lambda表达式的确切工作方式,但找不到。

    我的问题是:我有一些用不同方式表示的情绪分类。例如,肯定句用数字表示>大于0。它可以是1到无穷大(1、2、5、100……)对于否定句,用同样的方式,但用数字表示<小于0(-1,-2…)-我知道这不是更好的表达方式。

    我需要计算出阳性发生率的平均值。我在这里找到的关于SOF问题的每个答案,如果我将所有值相加,除以总数,我将得到平均值。没关系。

    例如,如果我有11个句子,其中10个是正值,值为1,(总和为10),一个是负值,值为-10,那么我的平均值是:10-10/11=0。

    var average = context.CatchDetails.Where(x => x.Monitoring.Client.Id == custmrid
                && x.Data.published >= datai2
                && x.Data.published <= dataf2
                && x.Monitoring.id == monitoring).ToList().Average(y => y.Sentiment);
    

    我要做的是,取所有的肯定句(count),除以总句数(count)。例子:

    总计数=11
    正计数=10

    11月10日=0.9090,即90,90%的阳性事件。

    var positive = context.CatchDetails.Count(x => (x.Monitoring.Client.Id == custmrid)
                && x.Data.published >= datai2 && x.Data.published <= dataf2
                && x.Monitoring.id == monitoring
                && x.Sentiment > 0);
    
    var total = context.CatchDetails.Count(x => (x.Monitoring.Client.Id == custmrid)
               && x.Data.published >= datai2 && x.Data.published <= dataf2
               && x.Monitoring.id == monitoring);
    
    double mediaPositive = ((double)positive / (double)total);
    

    有没有更好的可能性?

    搜索:

    How to get words average length using Lambda Expression

    Getting an average from a C# array

    1 回复  |  直到 8 年前
        1
  •  1
  •   Camilo Terevinto Chase R Lewis    8 年前

    您可以操纵从一个LINQ操作符传递到另一个LINQ操作符的数据:

    var avg = data.Select(x => x.Sentiment > 0 ? x.Sentiment : 0)
                  .Average();
    

    因此,将所有负值都视为零。

    或者,如果您想忽略某些项目的值,但仍将其包含在计数中,则需要自己进行平均值计算。

    var count = data.Count();
    var total = data.Select(x => x.Sentiment > 0).Sum(x => x.Sentiment);
    // Avoid divide by zero if no data...
    var avg = count > 0 ? total/count : defaultValue;
    

    然而,您似乎只需要两个不同的计数:

    var totalCount = data.Count();
    var positiveCount = data.Select(x => x.Sentiment > 0).Count();
    // Ignore totalCount == 0! But force floating point calc.
    var res = (double)positiveCount / totalCount;