我试图找出如何将过滤器添加到与维度过滤器无关的交叉过滤器组。让我们看一个例子:
var livingThings = crossfilter({
// Fact data.
{ name: “Rusty”, type: “human”, legs: 2 },
{ name: “Alex”, type: “human”, legs: 2 },
{ name: “Lassie”, type: “dog”, legs: 4 },
{ name: “Spot”, type: “dog”, legs: 4 },
{ name: “Polly”, type: “bird”, legs: 2 },
{ name: “Fiona”, type: “plant”, legs: 0 }
}); //taken from http://blog.rusty.io/2012/09/17/crossfilter-tutorial/
如果我们要在类型和一组维度上创建维度:
var typeDim = livingThings.dimension(function(d){return d.type});
var typeGroup = typeDim.group();
我们希望typeGroup.top(Infinity)输出
{{human:2},
{dog:2},
{bird:1},
{plant:1}}
我的问题是我们如何过滤数据,使其在此分组中只包含4个有腿的生物?我也不想使用dimension.filter ...因为我不希望这个过滤器是全局的,只是为了这个分组。换句话说
var filterDim = livingThings.dimension(function(d){return d.legs}).filterExact(4);
是不允许的。
我正在考虑类似于我在https://stackoverflow.com/a/30467216/4624663中过滤后维度所采取的措施 基本上我想进入typeDim维度的内部,并在将数据传递到组之前过滤数据。创建一个调用typeDim.group()。top()的假组很可能不会起作用,因为各个livingThings记录已按该点分组。我知道这很棘手:谢谢你的帮助。
V
答案 0 :(得分:0)
可能最好使用reduceSum功能来创建一个伪计数组,该组只计算4条或更多条腿的记录:
var livingThings = crossfilter({
// Fact data.
{ name: “Rusty”, type: “human”, legs: 2 },
{ name: “Alex”, type: “human”, legs: 2 },
{ name: “Lassie”, type: “dog”, legs: 4 },
{ name: “Spot”, type: “dog”, legs: 4 },
{ name: “Polly”, type: “bird”, legs: 2 },
{ name: “Fiona”, type: “plant”, legs: 0 }
}); //taken from http://blog.rusty.io/2012/09/17/crossfilter-tutorial/
var typeDim = livingThings.dimension(function(d){return d.type});
var typeGroup = typeDim.group().reduceSum(function(d) {
return d.legs === 4 ? 1 : 0;
});
这将计算出一个计算值,对于有4条腿的记录将为1,对于具有...而不是4条腿的记录为0。换句话说,它应该算上四条腿的生物。
答案 1 :(得分:0)
我想,这就是你要找的东西。如果我错了,请回复。
var dimByLegs = livingThings.dimension(function(d){return d.legs});
dimByLegs.filterExact(4);
var dogs = dimByLegs.group();
dimByLegs.top(Infinity).forEach(function(d){console.log(d.type, d.legs);});
dimByLegs.dispose();