Imports System Imports System.Text Imports System.Collections Imports Microsoft.VisualBasic Imports CenterSpace.NMath.Core Imports System.IO Namespace CenterSpace.NMath.Examples.VisualBasic A .NET example in Visual Basic showing how to use the cross-tabulation functionality of DataFrame. As illustrated in the FactorExample, the DataFrame.GetFactor() method can be used in conjunction with Subset.GetGroupings() to access "cells" of data based on one or two grouping factors. This is such a common operation that class DataFrame also provides the Tabulate() methods as a convenience. This method accepts one or two grouping columns, a data column, and a delegate to apply to each data column subset. The results are returned in a new data frame. Module CrossTabulationExample Sub Main() Read in data from the file. The data show test scores for 18 children on a simple reading test. The childs gender ("male" or "female") and grade (4, 5, or 6) is also recorded. Dim DF As DataFrame = DataFrame.Load("CrossTabulationExample.dat", True, False, ControlChars.Tab, True) Console.WriteLine() Console.Write(DF) Console.WriteLine() Console.WriteLine() This code encapsulates the static StatsFunctions.Mean() function in a Func(Of IDFColumn, Double) delegate, then displays the average test score for each grade: Dim Mean As New Func(Of IDFColumn, Double)(AddressOf StatsFunctions.Mean) Console.WriteLine(DF.Tabulate("Grade", "Score", Mean)) Console.WriteLine() The code shows the average test score for every combination of gender and grade: Dim Means As DataFrame = DF.Tabulate("Grade", "Gender", "Score", Mean) Console.WriteLine(Means) Console.WriteLine() The returned data frame can be easily accessed for individual results: Console.WriteLine("Average score for boys in grade 5 = " & Means(5, "male")) Console.WriteLine("Average score for grade 5 = " & Means(5, "Overall")) Console.WriteLine("Average score for boys = " & Means("Overall", "male")) Console.WriteLine("Grand average = " & Means("Overall", "Overall")) Console.WriteLine() Most of the static descriptive statistics functions on class StatsFunctions accept an IDFColumn and return a double. A few return integers. For example, this code encapsulates StatsFunctions.Count(), which returns the number of items in a column, in a Func(Of IDFColumn, Int), then displays the number of subjects in each cell: Dim Count As New Func(Of IDFColumn, Integer)(AddressOf StatsFunctions.Count) Console.WriteLine(DF.Tabulate("Grade", "Gender", "Score", Count)) Console.WriteLine() The delegate the returns a generic object can be especially useful if you want to tabulate a variety of summary statistics all at once: Dim GetSummaryDelegate As New Func(Of IDFColumn, Object)(AddressOf CrossTabulationExample.GetSummary) Dim SummaryStats As DataFrame = DF.Tabulate("Grade", "Gender", "Score", GetSummaryDelegate) Console.WriteLine("Summary Statistics for Boys in Grade 6") Console.WriteLine(SummaryStats(6, "male")) Console.WriteLine() Console.WriteLine("Press Enter Key") Console.Read() End Sub Function GetSummary(ByVal Data As IDFColumn) As Object Dim MySummary As Summary = New Summary MySummary.N = StatsFunctions.Count(Data) MySummary.Mean = StatsFunctions.Mean(Data) MySummary.StDev = StatsFunctions.StandardDeviation(Data) MySummary.Min = StatsFunctions.MinValue(Data) MySummary.Max = StatsFunctions.MaxValue(Data) Return MySummary End Function End Module Public Class Summary Public N As Integer Public Mean As Double Public StDev As Double Public Min As Double Public Max As Double Overrides Function ToString() As String Dim NL As String = System.Environment.NewLine Dim Buff As StringBuilder = New StringBuilder() Buff.Append("Size = " & N & NL) Buff.Append("Mean = " & Mean & NL) Buff.Append("Standard Deviation = " & StDev & NL) Buff.Append("Minimum = " & Min & NL) Buff.Append("Maximum = " & Max & NL) Return Buff.ToString() End Function End Class End Namespace← All NMath Code Examples