【发布时间】: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
【问题讨论】:
-
您打算使用 Crossfilter 进行交互吗?在这种情况下,您将使用
group.reduceSum。 Crossfilter 文档在这里介绍了它:github.com/crossfilter/crossfilter/wiki/… 如果您不使用 Crossfilter 进行交互,那么我根本不会使用它。只需使用 Array.reduce (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…) 或 d3 的 d3.sum (github.com/d3/d3-array#sum) -
tks,我想用它来进行交互,只是想了解一下它