【问题标题】:Filter data being passed into a crossfilter group without using dimensional filters在不使用维度过滤器的情况下过滤传递到交叉过滤器组的数据
【发布时间】:2015-06-01 19:54:49
【问题描述】:

我试图弄清楚如何将过滤器添加到与维度过滤器无关的交叉过滤器组中。我们来看一个例子:

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

【问题讨论】:

    标签: grouping crossfilter


    【解决方案1】:

    最好使用 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。换句话说,它应该只计算四足生物。

    【讨论】:

    • 嗨,Ethan,没错,它会给我四条腿的动物数量,但我真正想要的是四条腿的动物分组。因此,我希望 typeGroup.top(Infinity) 的输出为:{{dog:2}}。相反,如果我选择 2 条腿,我会期望 {{human:2},{bird:1}}
    • 如果您使用测试d.legs === 2 创建一个新组,这正是您将得到的,不是吗?只需为您感兴趣的每条腿创建组 :-) 还是我误解了?如果是这样,你能举一个你正在寻找的输出的例子吗?
    【解决方案2】:

    我想,这就是你要找的。如果我错了,请评论。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 2019-07-18
      • 2012-10-05
      • 1970-01-01
      • 2014-06-23
      • 2012-06-28
      相关资源
      最近更新 更多