使用Crossfilter(https://github.com/square/crossfilter)时,我指定在添加和删除组中的数据时要使用的函数。跟踪运行平均值(使用CoffeeScript)非常简单:
reduceAdd = (p, v) ->
++p.count;
p.sum += v.digit;
p
reduceRemove = (p, v) ->
--p.count;
p.sum -= v.digit;
p
reduceInitial = ->
{
count: 0
sum: 0
average: ->
return 0 if this.count == 0
return this.sum / this.count
}
是否可以跟踪每组的最大值和最小值?我无法弄清楚如何将所有元素保存在一个巨大的数组中并执行d3.min / d3.max。似乎添加/删除数据效率极低。
我还寻找一种方法告诉Crossfilter从头开始完全重建组,而不是从现有组中删除项目。如果应用过滤器,则重置并重建该组。没什么了不起的。
答案 0 :(得分:9)
您可以使用dimension.top(1)和dimension.bottom(1)来检索当前的最小值和最大值。这些方法涉及可能在交叉滤波器上处于活动状态的任何过滤器。
答案 1 :(得分:3)
我提出的最佳解决方案是跟踪有序列表中的所有值,并使用简单的快速排序样式插入函数(cp。如何insert a number into a sorted array)添加元素并使用它们删除它们的indexOf。
常用功能:
function insertElement(element, array) {
array.splice(locationOfElement(element, array) + 1, 0, element);
return array;
}
function removeElement(element, array) {
var index = array.indexOf(element);
if (index >= 0) array.splice(index, 1);
return array;
}
function locationOfElement(element, array, start, end) {
start = start || 0;
end = end || array.length;
var pivot = parseInt(start + (end - start) / 2, 10);
if (array[pivot] === element) return pivot;
if (end - start <= 1)
return array[pivot] > element ? pivot - 1 : pivot;
if (array[pivot] < element) {
return locationOfElement(element, array, pivot, end);
} else {
return locationOfElement(element, array, start, pivot);
}
}
function maxElement(array) {
return (array.length > 0) ?
array[array.length - 1] : null;
}
function minElement(array) {
return (array.length > 0) ?
array[0] : null;
}
从组中添加和删除数据以跟踪最小/最大时使用的函数:
minMaxDimension = cf.dimension(function (d) {
return d.key;
});
var reduceAdd = function(p, v) {
insertElement(v.value, p.elements);
return p;
};
var reduceRemove = function(p, v) {
removeElement(v.value, p.elements);
return p;
};
var reduceInitial = function() {
return {
elements: [],
max: function() { return maxElement(elements); },
min: function() { return minElement(elements); }
}
}
minMaxGroup = minMaxDimension
.group()
.reduce(reduceAdd, reduceRemove, reduceInitial)
.orderNatural()
.top(Infinity);
答案 2 :(得分:0)
在玩了一下之后,你可以通过再次调用group方法来重建组。