如何在数据集中找到每个成员的频率



我正在努力获取和分析一个大型数据集。我想知道数据集中每个值出现多少个。

让我们举一个小例子来澄清事情。

[
  {"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分析器。您可以确定哪些操作实际上导致了滞后。

我不确定这是否是处理这么多数据的最有效方法(再说一次,Javascript 不是为大数据而生的,所以效率不应该在你的脑海中)。

基本上,我会使用跟踪频率的关联数组来循环遍历所有数据。如果当前data.Company不在关联数组中,它会将其作为键添加到数组中,然后输入 1 的频率。如果找到它作为数组中的键,它将频率增加 1。

最新更新