计算数据表中列的统计分布

时间:2013-08-22 14:38:36

标签: vb.net datatable statistics row distribution

我不知道VB.Net中是否有特定的方法来计算Excel中的公式Frequency()之类的值数组的统计分布。如果不是最简单,最快捷的方式做同样的事情?

例如,我在名为“水泥偏差”的列中使用了我的值的DataTable:

Column Deviation
    0
   14
   11
    2
    6
    1
   16
   14
    5
   21

我想知道这些值的频率的频段是:

  • 从minValue到-50步骤为10
  • 从-50到-10到步骤为5
  • 从-10到-5步骤为1
  • 从-5到-1,步长为0.5
  • 从-1到-0.5步进0.1
  • 从-0.5到-0.1步进0.05
  • 从-0.1到0.1步进0.01
  • 从0.1到0.5步进0.05
  • 从0.5到1逐步0.1
  • 从步骤0.5到1的5到5
  • 从步骤1到5到10
  • 从步骤5到10到50
  • 从50到maxValue by Step of 10

有人可以帮我吗?

由于

1 个答案:

答案 0 :(得分:1)

我不知道你如何计算它,因为我的统计分布经验有限,你没有提到你想要计算它的方式。

但是,这至少可以编译:

Dim stat(2) As Integer
For Each row As DataRow In gridView.Rows
    Dim cementDeviation = row.Field(Of Int32)("Cement Deviation")
    Select Case cementDeviation 
        Case 0 To 10
            stat(0) += 1
        Case 10 To 20
            stat(1) += 1
    End Select
Next

一般来说,循环DataRows来计算值没什么不好。但是您应该将OPTION STRICT设置为on,然后您的代码将无法编译,因为row("Cement Deviation")是一个非整数的对象。好处是你被迫使用正确的类型来防止恶劣的运行时错误。

编辑以下是如何使用动态范围并使用LINQ计算每个类的示例。我使用DataTable来存储最小值和最大值,但您也可以使用不同的内存中集合,如List(Of CustomClass)甚至更好 - 数据库。

你也可以简单地循环表,但你想看到一个不同的方法。我喜欢LINQ,因为它可以减少复杂性并提高可读性:

包含样本数据的范围表:

Dim rangeTable = New DataTable()
rangeTable.Columns.Add("Min", GetType(Int32))
rangeTable.Columns.Add("Max", GetType(Int32))
For i = 0 To 90 Step 10
    rangeTable.Rows.Add(i, i + 10)
Next

单个LINQ查询,用于计算每个范围的所有出现次数,甚至是有序的降序:

Dim stats =
    From rangeRow In rangeTable
    Let min = rangeRow.Field(Of Int32)("Min")
    Let max = rangeRow.Field(Of Int32)("Max")
    Select StatsInfo = New With {
        .Min = min, .Max = max,
        .Count = (From devRow In devTable
                  Let cementDeviation = devRow.Field(Of Int32)("Cement Deviation")
                  Where cementDeviation >= min AndAlso cementDeviation <= max).Count()
    }
    Order By StatsInfo.Count Descending

输出结果:

For Each stat In stats
    Console.WriteLine("Min: {0} Max: {1} Count: {2}", stat.Min, stat.Max, stat.Count)
Next 

请注意,我已将DataTable重命名为devTable,因为gridView不是一个好名字。