[英]How can I find the frequency of each member in my data set
我正在努力获取和分析大型数据集。 我想知道每个值出现在数据集中多少个。
让我们举一个小例子来澄清问题。
[
{"Year": "1997", "Company": "Ford", "Model": "E350", "Length": "2.34"},
{"Year": "2000", "Company": "Mercury", "Model": "Cougar", "Length": "2.38"}
{"Year": "2001", "Company": "Ford", "Model": "Cougar", "Length": "2.38"}
]
我不确切知道我拥有什么值,但是我想对其进行哈希处理以这种方式获得结果。
[
{"Value": "Ford", "Frequency": 2},
{"Value": "Mercury", "Frequency": 1},
]
如果它不是动态的,并且我知道值,我将以这种方式进行操作:
var filteredCompany = data.filter(function(a) {
return /Ford/i.test(a.Company).lenght;
});
但是,我有一个非常大的数据集(900 Mbo),我需要以非常动态的方式进行此过程。
更新
var dataset = {}
d3.csv(link, function(data) {
dataset = data;
});
//Fetch data
var frequency = {};
var datasetlength = dataset.length;
for(var i = 0; i < datasetlength; i++){
var current = dataset[i];
if(!frequency.hasOwnProperty(current.company)) frequency[current.company] = 0;
frequency[current.company]++;
}
您可以做的是遍历所有条目,并将它们收集到一个对象中,其中键是名称,值是计数。 初始数据将如下所示:
{
"Ford" : 2,
"Mercury" : 1
}
您可以通过对象进行reduce
:
var frequency = hugeData.reduce(function(freq,current){
var currentCompany = current.Company;
if(!freq.hasOwnProperty(currentCompany)) freq[currentCompany] = 0;
freq[currentCompany]++;
return freq;
},{});
但是reduce
是ES5有时是缓慢的。 您可以执行一个普通循环:
var frequency = {};
var hugeDataLength = hugeData.length;
for(var i = 0; i < hugeDataLength; i++){
var current = hugeData[i];
var currentCompany = current.Company;
if(!frequency.hasOwnProperty(currentCompany)) frequency[currentCompany] = 0;
frequency[currentCompany]++;
}
现在我们已经将数据缩减为更易于管理的大小,您可以遍历频率数据并将其转换为数组,将键和值向下移动到对象中。
var chartData = Object.keys(frequency).map(function(company){
var value = frequency[company];
return {
Value : company,
Frequency : value
}
});
在过去的几个月中,我也做了类似的壮举,您的浏览器调试器是完成此工作的非常方便的工具,尤其是CPU分析器。 您可以确定哪些操作实际上导致了延迟。
我不确定这是否是处理大量数据的最有效方法(然后,Java并不是针对大数据编写的,因此效率不应该放在您的脑海中)。
基本上,我将使用跟踪频率的关联数组来遍历所有数据。 如果当前data.Company
不在关联数组中,它将作为键将其添加到数组中,然后输入频率1。 如果在数组中找到它作为键,它将使频率增加1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.