如何在我的 crossfilter 组中使用自定义 reduce 函数?
How can I have a custom reduce function in my crossfilter groups?
我的数据集中有一个数字字段。我正在使用仪表板通过年份、年龄等筛选该字段。事实上,这个字段是总体样本的比率,因此当我创建 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});
我想通过我选择的行的平均速率进行过滤。
我想我解决了这个问题并且我设法实现了我想要的:
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);
我的数据集中有一个数字字段。我正在使用仪表板通过年份、年龄等筛选该字段。事实上,这个字段是总体样本的比率,因此当我创建 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});
我想通过我选择的行的平均速率进行过滤。
我想我解决了这个问题并且我设法实现了我想要的:
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);