如何从crossfilter / reductio的组中创建一个组?

通过以下数据:

const now = new Date
const data = [
  { player: 'bob', color: 'blue', date: new Date(+now + 1000) },
  { player: 'bill', color: 'green', date: new Date(+now + 2000) },
  { player: 'bob', color: 'red', date: new Date(+now + 3000) },
  { player: 'barbara', color: 'blue', date: new Date(+now + 4000) },
  { player: 'barbara', color: 'cyan', date: new Date(+now + 8000) },
  { player: 'barbara', color: 'magenta', date: new Date(+now + 10000) },
  { player: 'barbara', color: 'yellow', date: new Date(+now + 20000) },
]

我想在颜色维度上减少计数,但只计算每个玩家的第一个颜色。 (注意:首先是可能被过滤的日期维度)。 我一直试图使用异常功能来处理reductio,但它没有给出预期的结果:

reducer = reductio()
reducer.exception('player').exceptionCount(true)
reducer(colorGroup)

结果应该如下所示:

blue,2     # bob and barbara
cyan,0
green,1    # bill
magenta,0
red,0
yellow,0

另一个例子,将日期维度过滤为now+2100 .. now+20000 (即第一行被过滤掉):

blue,1     # barbara
cyan,0
green,0    # (bill's first color is not counted because it is outside the date range)
magenta,0
red,1      # bob (blue is his first color overall, red is his first in this date range)
yellow,0

注:我有其他分组使用所有的行,所以我不能只是预先筛选列表,然后将其加载到交叉过滤器中。

有没有办法使用reductio()? 或者如何直接用crossfilter做到“分组分组”的一些例子?

编辑

链接到jsfiddle显示意外的结果:https://jsfiddle.net/qt5jxjm1/


我不确定crossfilter是否会在这里帮助你 - 它并没有真正考虑值的顺序,它当然没有办法按一个键排序,然后由另一个键排序。

这里是一个假组,它将通过使用另一个维度排序,以及一些组键和“第一个字段”(即您希望查找第一个字段的字段)的访问器来完成您想要的任务。

function double_reduce(dim, groupf, firstf) {
    return {
      all: function() {
      var recs = dim.bottom(Infinity);
      var hit = {}, bins = {};
      recs.forEach(function(r) {
        var fkey = firstf(r), gkey = groupf(r);
        var count = hit[fkey] ? 0 : 1;
        hit[fkey] = true;
        bins[gkey] = (bins[gkey] || 0) + count;
      });
      return Object.keys(bins).map(function(k) {
        return {key: k, value: bins[k]};
      });
    }
  }
}

像这样使用它:

var dubred_group = double_reduce(dateDim,
    function(r) { return r.color;}, function(r) { return r.player; });

有一件事不能做的是为任何被过滤掉的值传递零。 通常交叉过滤器会进行增量式添加和删除,我不知道在这里如何实现。

所以没有过滤日期的结果看起来不错:

[
  {
    "key": "blue",
    "value": 2
  },
  {
    "key": "green",
    "value": 1
  },
  {
    "key": "red",
    "value": 0
  },
  {
    "key": "cyan",
    "value": 0
  },
  {
    "key": "magenta",
    "value": 0
  },
  {
    "key": "yellow",
    "value": 0
  }
]

但是,对于已过滤的情况,存在缺少的垃圾箱,因为绿色未出现在已过滤的数据中:

[
  {
    "key": "red",
    "value": 1
  },
  {
    "key": "blue",
    "value": 1
  },
  {
    "key": "cyan",
    "value": 0
  },
  {
    "key": "magenta",
    "value": 0
  },
  {
    "key": "yellow",
    "value": 0
  }
]

这可能是固定的,但我想我会张贴这反馈。

在小提琴演示:http://jsfiddle.net/zdq4rj13/7/

链接地址: http://www.djcxy.com/p/32815.html

上一篇: How to create a group from a group in crossfilter/reductio?

下一篇: Crossfilter grouping keys based on values