过滤数据传递到交叉过滤器组而不使用维度过滤器

时间:2015-06-01 19:54:50

标签: grouping crossfilter

我试图找出如何将过滤器添加到与维度过滤器无关的交叉过滤器组。让我们看一个例子:

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

2 个答案:

答案 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();