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

我认为您的方向是正确的,但是

  1. 您的 ?: 可能会倒转
  2. 您可能需要计算每个类别的总数,并且
  3. 不使用总计

我们以这一行为例:

    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;
},