0

Frequency()Excelの数式のように、値の配列から統計分布を計算する特定の方法がVB.Netにあるかどうかはわかりません。そうでない場合、同じことを行う最も簡単で最速の方法は何ですか?

たとえば、「Cement Deviation」という列に値を含む 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.05 のステップで 0.1 から 0.5 まで
  • 0.5 から 1 まで 0.1 刻み
  • 1 から 5 まで 0.5 刻み
  • 5 から 10 まで 1 ステップずつ
  • 10 から 50 まで 5 ステップ
  • 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 STRICTする必要があります。 はオブジェクトではonないため、コードはコンパイルされません。row("Cement Deviation")良いことは、厄介な実行時エラーを防ぐ正しい型を使用することを余儀なくされることです。

編集これは、動的範囲を使用してLINQで各クラスをカウントする方法の例です。最小値と最大値を格納するためにa を使用し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したことに注意してください。devTablegridView

于 2013-08-22T18:52:49.473 に答える