对字符串和数字使用汇总

问题描述 投票:1回答:1

我正在使用以下数据集:

Landen,"Perioden","SITC","Onderwerpen_1","Waarde eenheid","Waarde"
Afghanistan,"2012","0 Voeding en levende dieren","Invoerwaarde","mln euro","1"
Afghanistan,"2012","1 Dranken en tabak","Invoerwaarde","mln euro","0"
Afghanistan,"2012","2 Grondstoffen niet eetbaar behalve...","Invoerwaarde","mln euro","."
Afghanistan,"2012","3 Minerale brandstoffen smeermiddele...","Invoerwaarde","mln euro","."
Afghanistan,"2012","4 Dierlijke en plantaardige oliën en ...","Invoerwaarde","mln euro","."
Afghanistan,"2012","5 Chemische producten","Invoerwaarde","mln euro","0"
Afghanistan,"2012","6 Fabricaten hoofdzakelijk gerangschi...","Invoerwaarde","mln euro","0"
Afghanistan,"2012","7 Machines en vervoermaterieel","Invoerwaarde","mln euro","1"
Afghanistan,"2012","8 Diverse gefabriceerde goederen","Invoerwaarde","mln euro","1"
Afghanistan,"2012","9 Niet afzonderlijk genoemde goederen","Invoerwaarde","mln euro","0"

我做的第一件事就是改变所有不是“Waarde”的值。“整数如此:

for (let i = 0; i < dataTotal.length; i++) {
    if (dataTotal[i].Waarde != ".") {
        dataTotal[i].Waarde = parseInt(dataTotal[i].Waarde);
    }
}

然后我用d3.nest创建一个新的更可用的数组,如下所示:

nested_data = d3.nest()
    .key(function (d) {
        return d.SITC;
    })
    .rollup(function (d) {
        return d3.sum(d, function (e) {
                return e.Waarde
        });
    });
    .entries(dataTotal);

结果如下:

如你所见,d3.sum改变了“。”。值为0,这是有道理的。但是,当dataTotal.Waarde是一个数字时,我希望汇总返回一个数字,并返回一个带有“。”的字符串。什么时候不是。我尝试了以下方法:

nested_data = d3.nest()
    .key(function (d) {
        return d.SITC;
    })
    .rollup(function (d) {
        if (typeof dataTotal.Waarde == "number") {
            return d3.sum(d, function (e) {
                return e.Waarde
            });
        } else if (typeof dataTotal.Waarde == "string"){

        }
    })
    .entries(dataTotal);

这是结果:

现在它返回所有值的undefined。我怎么能解决这个问题,我希望汇总返回dataTotal.Waarde是一个数字的数字,并返回字符串“。”它不在哪里?

javascript d3.js
1个回答
1
投票

根据你的comment你根本不需要d3.nest()!您可以使用简单的map创建所需的数组,使用unary plus将字符串转换为数字,并在NaN的情况下测试"."

const nested = data.map(function(d) {
  return {
    key: d.SITC,
    value: +d.Waarde === +d.Waarde ? +d.Waarde : d.Waarde
  };
});

这是一个演示:

const csv = `Landen,"Perioden","SITC","Onderwerpen_1","Waarde eenheid","Waarde"
Afghanistan,"2012","0 Voeding en levende dieren","Invoerwaarde","mln euro","1"
Afghanistan,"2012","1 Dranken en tabak","Invoerwaarde","mln euro","0"
Afghanistan,"2012","2 Grondstoffen niet eetbaar behalve...","Invoerwaarde","mln euro","."
Afghanistan,"2012","3 Minerale brandstoffen smeermiddele...","Invoerwaarde","mln euro","."
Afghanistan,"2012","4 Dierlijke en plantaardige oliën en ...","Invoerwaarde","mln euro","."
Afghanistan,"2012","5 Chemische producten","Invoerwaarde","mln euro","0"
Afghanistan,"2012","6 Fabricaten hoofdzakelijk gerangschi...","Invoerwaarde","mln euro","0"
Afghanistan,"2012","7 Machines en vervoermaterieel","Invoerwaarde","mln euro","1"
Afghanistan,"2012","8 Diverse gefabriceerde goederen","Invoerwaarde","mln euro","1"
Afghanistan,"2012","9 Niet afzonderlijk genoemde goederen","Invoerwaarde","mln euro","0"`;

const data = d3.csvParse(csv);

const nested = data.map(function(d) {
  return {
    key: d.SITC,
    value: +d.Waarde === +d.Waarde ? +d.Waarde : d.Waarde
  };
});

console.log(nested)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
© www.soinside.com 2019 - 2024. All rights reserved.