我的数据集中有一个数字字段。我正在做,并且仪表板通过年份,年龄等来过滤该字段。事实是,此字段是总体样本中的比率,因此,当我创建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});
我想过滤所选择行的平均速率。
答案 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);