dc.js 按行值过滤
dc.js filter by row values
我有一个类似于下面的数据集:
我想在“火车运输”中找到“海运”的总金额,并用 dc.numberDisplay("#");
显示
海运总货量/火车总货量
不确定我是否需要使用自定义缩减。
到目前为止我使用了下面的代码但是它 returns 1
ndx = crossfilter(data);
var all = ndx.groupAll();
var allGroup = all.reduce(
function (p, v) {
p.total += v.total;
p.sea = (v.shipment_type === "sea") ? 0 : p.total ;
p.train = (v.shipment_type === "train") ? 0 : p.total ;
p.air = (v.shipment_type === "air") ?0 : p.total ;
p.sea_over_train = p.sea / p.train;
return p;
},
function (p, v) {
p.total -= v.total;
p.sea = (v.shipment_type === "sea") ? 0 : p.total ;
p.train = (v.shipment_type === "train") ? 0 : p.total ;
p.air = (v.shipment_type === "air") ?0 : p.total ;
p.sea_over_train = p.sea / p.train;
return p;
},
function () {
return {
total: 0,
sea: 0,
train :0,
air:0,
sea_over_train:0,
};
}
);
seaOverTrain
.group(allGroup)
.valueAccessor(function (x) { return x.sea_over_train; })
.formatNumber(d3.format(".3s"));
我认为您的方向是正确的,但是
- 您的
?:
可能会倒转
- 您可能需要计算每个类别的总数,并且
- 不使用总计
我们以这一行为例:
p.sea = (v.shipment_type === "sea") ? 0 : p.total ;
如果 shipment_type
为 "sea"
,这会将 p.sea
设置为 0,否则将其设置为 p.total
。你可能想要反过来。
此外,我认为您的意图是保持 运行 海运、火车和空运的总和,因此您可以使用 +=
和 -=
,以及 v.total
, 这样做。
目前,这些变量将从 p.total
中获取总和(这可能是您得到 1 的原因……不确定……)
将这些想法放在一起我们得到:
function (p, v) {
p.total += v.total;
p.sea += (v.shipment_type === "sea") ? v.total : 0 ;
p.train += (v.shipment_type === "train") ? v.total : 0 ;
p.air += (v.shipment_type === "air") ? v.total : 0 ;
p.sea_over_train = p.sea / p.train;
return p;
},
function (p, v) {
p.total -= v.total;
p.sea -= (v.shipment_type === "sea") ? v.total : 0 ;
p.train -= (v.shipment_type === "train") ? v.total : 0 ;
p.air -= (v.shipment_type === "air") ? v.total : 0 ;
p.sea_over_train = p.sea / p.train;
return p;
},
我有一个类似于下面的数据集:
我想在“火车运输”中找到“海运”的总金额,并用 dc.numberDisplay("#");
显示海运总货量/火车总货量
不确定我是否需要使用自定义缩减。
到目前为止我使用了下面的代码但是它 returns 1
ndx = crossfilter(data);
var all = ndx.groupAll();
var allGroup = all.reduce(
function (p, v) {
p.total += v.total;
p.sea = (v.shipment_type === "sea") ? 0 : p.total ;
p.train = (v.shipment_type === "train") ? 0 : p.total ;
p.air = (v.shipment_type === "air") ?0 : p.total ;
p.sea_over_train = p.sea / p.train;
return p;
},
function (p, v) {
p.total -= v.total;
p.sea = (v.shipment_type === "sea") ? 0 : p.total ;
p.train = (v.shipment_type === "train") ? 0 : p.total ;
p.air = (v.shipment_type === "air") ?0 : p.total ;
p.sea_over_train = p.sea / p.train;
return p;
},
function () {
return {
total: 0,
sea: 0,
train :0,
air:0,
sea_over_train:0,
};
}
);
seaOverTrain
.group(allGroup)
.valueAccessor(function (x) { return x.sea_over_train; })
.formatNumber(d3.format(".3s"));
我认为您的方向是正确的,但是
- 您的
?:
可能会倒转 - 您可能需要计算每个类别的总数,并且
- 不使用总计
我们以这一行为例:
p.sea = (v.shipment_type === "sea") ? 0 : p.total ;
如果 shipment_type
为 "sea"
,这会将 p.sea
设置为 0,否则将其设置为 p.total
。你可能想要反过来。
此外,我认为您的意图是保持 运行 海运、火车和空运的总和,因此您可以使用 +=
和 -=
,以及 v.total
, 这样做。
目前,这些变量将从 p.total
中获取总和(这可能是您得到 1 的原因……不确定……)
将这些想法放在一起我们得到:
function (p, v) {
p.total += v.total;
p.sea += (v.shipment_type === "sea") ? v.total : 0 ;
p.train += (v.shipment_type === "train") ? v.total : 0 ;
p.air += (v.shipment_type === "air") ? v.total : 0 ;
p.sea_over_train = p.sea / p.train;
return p;
},
function (p, v) {
p.total -= v.total;
p.sea -= (v.shipment_type === "sea") ? v.total : 0 ;
p.train -= (v.shipment_type === "train") ? v.total : 0 ;
p.air -= (v.shipment_type === "air") ? v.total : 0 ;
p.sea_over_train = p.sea / p.train;
return p;
},