0

我不知道 VB.Net 中是否有特定的方法可以根据Frequency()Excel 中的公式等值数组计算统计分布。如果不是,做同样事情的最简单和最快的方法是什么?

例如,我有一个 DataTable,我的值在名为 "Cement Deviation" 的列中:

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
  • 从 1 到 5,步长为 0.5
  • 从 5 到 10 步长为 1
  • 5步从10到50
  • 从 50 到 maxValue,步长为 10

有人可以帮我吗?

谢谢

4

1 回答 1

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 STRICTon,那么您的代码将无法编译,因为row("Cement Deviation")它是一个对象而不是整数。好消息是您被迫使用正确的类型,以防止出现令人讨厌的运行时错误。

编辑这是一个示例,您可以如何使用动态范围并使用 LINQ 计算每个类。我已经使用 aDataTable来存储最小值和最大值,但您也可以使用不同的内存中集合,比如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 

请注意,我已将您的名称重命名为DataTabledevTable因为gridView这不是一个好名字。

于 2013-08-22T18:52:49.473 回答