【问题标题】:summ all the values of a field using crossfilter?使用交叉过滤器对字段的所有值求和?
【发布时间】:2016-09-22 03:08:50
【问题描述】:

给定这个数据集here

Date    Origin  Destination Delay (mins)
03/01/2001 13:05:00 MCI MDW 8
03/01/2001 13:45:00 LAS PHX 95
03/01/2001 18:30:00 LAX PHX 10
03/01/2001 18:30:00 ONT PHX 0
03/01/2001 18:30:00 LAS LAX -9
03/01/2001 18:30:00 LAX OAK 12
03/01/2001 18:40:00 ONT SMF -8
03/01/2001 19:00:00 MDW BNA -1
03/01/2001 19:00:00 OAK LAX -10
03/01/2001 19:00:00 LAS LAX -11
...

如何对Delay 字段中的所有值求和?我知道有负值,我只是以此为例。

我正在考虑使用 crossfilter 来执行此操作,但不确定是否有一种简单的方法来执行此操作,只需编写一个 javascript 函数。 例如,我可以获得总记录/行数,低于 2692

cf.size()
//2692

注意
调出控制台模式 (Ctrl-shift-I) 并输入 cf.size()
交叉过滤器已经在源代码中定义(Ctrl-U)var cf = crossfilter(data);


编辑1

使用d3.sum

d3.sum(data,function(d){return d.delay;})
30632

使用 array.reduce - 请参阅 JavaScript Array.prototype.reduce - 0 是什么?

data.reduce(function(total,d){ return total+ d.delay }, 0)
30632

使用交叉过滤器,但这只是在交叉过滤器延迟维度上使用上述reducevar delayDimension = cf.dimension(function(d) {return d.delay;});

delayDimension.top(Infinity).reduce(function(total,d){ return total+ d.delay }, 0)
30632

注意:

这会返回最后一个元素中的延迟值:

data.reduce(function(total,num){ return num.delay })
165

编辑2

对此进行调整: Custom calculated aggregated field in Crossfilter

创建维度:

origin=cf.dimension(function(d) { return d.origin; })

创建我的 reduceAdd、reduceMove 和 reduceInitial 函数:

var reduceAdd = function(p, v) {
    p.delay += v.delay;
    return p;
}

var reduceRemove = function(p, v) {
    p.delay -= v.delay;
    return p;
}

var reduceInitial = function() {
    return {
        delay : 0
    }
}

控制台输出示例:

var json = origin.group().reduce(reduceAdd,reduceRemove,reduceInitial).orderNatural().top(Infinity);
undefined
json
[Objectkey: "ALB"value: Objectdelay: -1__proto__: Object__proto__: Object, Objectkey: "AMA"value: Objectdelay: 171__proto__: Object__proto__: Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object]
json[0]
Object {key: "ALB", value: Object}
json[0].value
Object {delay: -1}

这里还有一个不错的: What are the reduceAdd, reduceSum , reduceRemove functions in crossfilter? How should they be used? 但仍然不是我想要的,这是每个类别的总和,我想要一个总和,例如对于加在一起的所有延迟值,期待30632 的答案。


EDIT3

从控制台打印输出下方的docs 得到它:

cf.size()
//2692

var reduceAdd = function(p, v) {
    p.delay += v.delay;
    return p;
}

var reduceRemove = function(p, v) {
    p.delay -= v.delay;
    return p;
}

var reduceInitial = function() {
    return {
        delay : 0
    }
}

cf_groupAll=cf.groupAll().reduce(reduceAdd,reduceRemove,reduceInitial)
//Object {}

cf_groupAll.value()
//Object {delay: 30632}

cf_groupAll.value().delay
//30632

【问题讨论】:

标签: javascript crossfilter


【解决方案1】:

您可以使用 jQuery 选择器来获取最后一列的值。然后您可以使用 parseInt(STRING, 10) 来解析整数值。然后你可以很容易地把它们算在一起。

var $elements = $('#data tr.item td:last-child')
var sum = 0
$elements.each(function() {
  var currentValue = parseInt($(this).html(), 10)
  sum += currentValue
})

【讨论】:

  • tks,这仅适用于表中的行sum 86 需要让表显示所有内容才能正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
相关资源
最近更新 更多