Vb.net 从数据表中的列计算统计分布

Vb.net 从数据表中的列计算统计分布,vb.net,datatable,statistics,row,distribution,Vb.net,Datatable,Statistics,Row,Distribution,我不知道VB.Net中是否有一种特定的方法,可以从Excel中的公式Frequency()这样的值数组计算统计分布。如果不是,做同样的事情最简单和最快的方法是什么 例如,我有一个数据表,其值位于一个名为“水泥偏差”的列中: 我想知道这些值的频率的频带是: 通过10步从最小值到-50 通过5步从-50到-10 通过1的步骤从-10到-5 以0.5的步长从-5到-1 按0.1的步长从-1到-0.5 从-0.5到-0.1,逐步增加0.05 按0.01的步长从-0.1到0.1 按0.05的步长从0.1

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

例如,我有一个数据表,其值位于一个名为“水泥偏差”的列中:

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

  • 通过10步从最小值到-50
  • 通过5步从-50到-10
  • 通过1的步骤从-10到-5
  • 以0.5的步长从-5到-1
  • 按0.1的步长从-1到-0.5
  • 从-0.5到-0.1,逐步增加0.05
  • 按0.01的步长从-0.1到0.1
  • 按0.05的步长从0.1到0.5
  • 按0.1的步长从0.5到1
  • 按0.5的步长从1到5
  • 按1的步骤从5到10
  • 通过5步从10到50
  • 通过10步从50到最大值
有人能帮我吗


谢谢

我不知道你是如何计算的,因为我在统计分布方面的经验有限,你也没有提到你想要的计算方法

但是,这至少可以编译:

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
来计算值没有什么不好的。但是您应该将
选项STRICT
设置为
on
,这样代码就不会编译,因为
行(“水泥偏差”)
是一个非整数的对象。好的方面是,您必须使用正确的类型,以防止出现严重的运行时错误

编辑下面是一个示例,说明如何使用动态范围并使用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

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

那么问题是什么,难道你不知道如何从数据行中获取一个值,或者你不知道如何计算统计分布吗?我知道如何做这两件事,但我不知道是否有比我的示例更好的方法。是的,对于
行(“水泥偏差”)
你是对的,我没有注意我的示例。但是,我怎样才能让最终用户选择课程,而不是让我自己选择10级和20级?什么是“让用户选择课程”?使用变量而不是常量值。你能在你的问题中举个例子吗?好的,我错了。。。我将给出更多的解释:首先在一个专栏中,我有一些数字。例如:{0,14,11,2,6,1,16,14,5,21}在问题a中为统计分布做了一个例子(你为我更正了这个例子…谢谢),他计算了我在10类(从0到10)和20类(从10到20)中有一个值的次数。如果除了使用
Select Case
之外,没有其他方法可以计算每个类中的值,那么我如何动态地选择类?例如,不是从0到10,从0到5,从5到10,…@Rave:通常您将其存储在数据库中,您使用的是数据库吗?仍然很难看出你问题的核心问题。例如,您可以使用
列表(CustomClass)
或包含所有范围的
数据表。稍后我会给你举个例子。@Rave:编辑我的答案,以演示如何使用动态范围。我想这就是我要找的,但我不能在明天之前尝试。我将编辑我的问题,以提供更多细节,并让那些可能会问自己同样问题的人更清楚。
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