【发布时间】:2021-06-21 01:28:39
【问题描述】:
我有一些从 csv 文件读入 DataGridViews 的数据集,我需要绘制一些图表,在其中计算每列中每个不同变量的频率。
我找到了一个code,它计算数组元素的频率然后打印它们,我尝试在我的数据网格上使用相同的逻辑。
我从一个只有 2 个值(2.0 或 1.0)的列(“SEX”列)开始,但是当我尝试查看计数结果时,我总是得到 1(这意味着它没有计算事物)。它应该显示在列中找到的最后一个不同值的计数(在我的例子中是 2.0,它出现了 140 次)。
编辑:我尝试将计数结果附加到文本框,我看到每个循环都得到1,而我应该只得到2个值(这是计数2.0然后是计数1.0)
我还需要绘制输出,所以我猜我可以使用字典来存储变量名 + 频率。
public void countFreq() //function to count the frequency of each var in a column -not working yet-
{
var n = dataGridView1.RowCount;
var visited = new bool[n];
// Traverse through array elements and
// count frequencies
for (var i = 0; i < n; i++)
{
// Skip this element if already processed
if (visited[i] || dataGridView1.Rows[i].Cells["SEX"].Value
== null)
continue;
// Count frequency
var count = 1;
for (var j = i + 1; j < n; j++)
if (dataGridView1.Rows[i].Cells["SEX"].Value == dataGridView1.Rows[j].Cells["SEX"].Value)
{
visited[j] = true;
count++;
}
textFile.Text += count.ToString(); //for testing purposes I used a textfield to print the last count value
}
}
我知道对于值是显式的列,我可以在我的数据网格行上循环并使用计数方法(我这样做了),但是对于我的大多数数据,我没有明确知道每一行中的值,所以我需要找到一种方法来做到这一点。
【问题讨论】:
-
很难理解您遇到了什么问题以及您要计算什么。我不知道发布的代码应该做什么。您是否要获取性别列中 1 和 2 的数量?
-
@JohnG 是的,我以 1 和 2 为例,但我希望在我的数据网格中的给定列中找到每个不同值的频率。这些值通常是未知的,所以我可以使用类似
if (dataGridView1.Rows[i].Cells["SEX"].Value.ToString() == "1.0") count++; -
我建议使用
Dictionary,其中找到的值是键,值是计数。 -
@JohnG 问题是我不知道在某些列中可以找到什么值,所以我不能在那里明确使用这个条件,即
if (dataGridView1.Rows[i].Cells["RandomColumn"].Value.ToString() == "RandomValue")而我在这里尝试的解决方案没有似乎不像它应该的那样工作 -
我没有听懂你的意思。除了在该列中找到每个“不同”值的次数之外,您是否还试图查找列中的所有“不同”值?
标签: c# .net visual-studio winforms