如何在交叉过滤器组中具有自定义的reduce函数?

时间:2019-02-02 11:44:01

标签: dc.js crossfilter

我的数据集中有一个数字字段。我正在做,并且仪表板通过年份,年龄等来过滤该字段。事实是,此字段是总体样本中的比率,因此,当我创建var ratesPerAge = ageDim.group().reduceSum(function(d) {return +d.suicidesPercentage});时,由于我使用.reduceSum(),因此汇总了每条记录的比率。

我的目标是在过滤后的行上设置类似平均值的值,并且每次都具有平均值。

我尝试使用在另一个线程中找到的此功能来实现我想要的解决方案。

var col1DimTotal = col1Dim.group().reduce(reduceAdd, reduceRemove, 
  reduceInitial);

function reduceAdd(p, v) {
  ++p.count;
  p.total += v.value;
  return p;
}

function reduceRemove(p, v) {
  --p.count;
  p.total -= v.value;
  return p;
}

function reduceInitial() {
  return {count: 0, total: 0};
}

但是,这没有达到我想要的。

这是我的费率dimension以及另一个维度的分组:

 var ratesDim = ndx.dimension(function(d) {return 
 d.suicidesPercentage;});
 var ageDim = ndx.dimension(function(d) {return d.age});  
 var ratesPerAge = ageDim.group().reduceSum(function(d) {return 
 +d.suicidesPercentage}); 

我想过滤所选择行的平均速率。

1 个答案:

答案 0 :(得分:1)

I think I solved this and I managed to achieve what I wanted:
.
.
.
var yearDim  = ndx.dimension(function(d) { return new Date(d.year); });
function reduceAddAvg(p,v) {
    ++p.count
    p.sum += v.suicidesPercentage;
    p.avg = p.sum/p.count;
    return p;
}
function reduceRemoveAvg(p,v) {
    --p.count
    p.sum -= v.suicidesPercentage;
    p.avg = p.count ? p.sum/p.count : 0;
    return p;
}
function reduceInitAvg() {
    return {count:0, sum:0, avg:0};
}

var ratesPerYear = yearDim.group().reduce(reduceAddAvg, reduceRemoveAvg, reduceInitAvg);

 yearChart // line chart
     .width(660)
     .height(400)
     .dimension(yearDim)
     .group(ratesPerYear).valueAccessor(function (d) {
          return d.value.avg;
      }) // this is the reference of the AVG
     .x(d3.scaleTime().domain([new Date("January 1, 1987 00:00"), new 
        Date("January 4, 2015 00:00:00")]))
     .elasticY(true)
     .controlsUseVisibility(true)
     .yAxisLabel("Rates over 100k people")
     .xAxisLabel("Year")
     .centerBar(true);