2013-08-22 5 views
0

Я не знаю, есть ли в VB.Net определенный метод для вычисления статистического распределения из массива значений, таких как формула Frequency() в Excel. Если не самый простой и быстрый способ сделать то же самое?Вычислить статистические распределения из столбца в datatable

Например, я имею в 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
  • от 1 до 5 с шагом 0,5
  • от 5 до 10 с шагом 1
  • от 10 до 50 по шагу 5
  • От 50 До maxValue по шагу 10

Может ли кто-нибудь помочь мне с этим?

Благодаря

+0

Итак, в чем проблема, разве вы не знаете, как получить значение из DataRow или вы не знаете, как рассчитать статистическое распределение? –

+0

Я знаю, как это сделать, но я не знаю, нет ли лучшего способа, чем мой пример. – Rave

+0

Никто не может мне помочь? – Rave

ответ

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, так как это может уменьшить complexitiy и увеличить читаемость:

В таблице диапазон с данными выборки:

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 не является хорошим именем.

+0

Хорошо, моя ошибка ... Я приведу еще несколько объяснений: Сначала в столбце у меня есть цифры. Например: {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

+0

@Rave: Обычно вы сохраняете это в базе данных, используете ли вы его? До сих пор сложно понять основную проблему вашего вопроса. Например, вы можете использовать «Список (CustomClass)» или «DataTable», который содержит все диапазоны. Я попробую привести пример позже. –

+0

@Rave: отредактировал мой ответ, чтобы показать пример использования динамических диапазонов. –

Смежные вопросы