我不知道VB.Net中是否有特定的方法来计算Excel中的公式Frequency()
之类的值数组的统计分布。如果不是最简单,最快捷的方式做同样的事情?
例如,我在名为“水泥偏差”的列中使用了我的值的DataTable:
Column Deviation
0
14
11
2
6
1
16
14
5
21
我想知道这些值的频率的频段是:
有人可以帮我吗?
由于
答案 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
不是一个好名字。