d3数据解析/转换(从长到宽)

时间:2019-06-08 17:48:28

标签: javascript d3.js dataformat

我有一个CSV格式的数据集:

continents  countries   values
Europe  Germany 20
Europe  France  30
Europe  Spain   40
Asia    Singapore   100
Asia    Japan   300
Asia    China   30
Asia    Tiwan   500
America USA 50
America Canada  35
America Brazil  30
America Equador 14

当我使用d3.csvmap进行解析时,数据如下所示:

[
{continents: "Europe", countries: "Germany", values: 20}
{continents: "Europe", countries: "France", values: 30} 
{continents: "Europe", countries: "Spain", values: 40} and so forth. ]

我想要做的是将格式转换为按洲划分的宽格式,以便数据看起来像这样

[
{continents: "Europe", 
    values: {"Germany" : 20},
            {"France" : 30},
            {"Spain" : 40}},
{continents: "Asia",
    values: {"Singapore" : 100},
            {"Japan" : 300},
            {"China" : 30}}
]    

这就是我目前的做法。

d3.csv("/data/data.csv").then(function(csv) { 
    data = csv.map(function(d) {
        return {
            continents: d.continents,
            countries: d.countries,
            values: +d.values}
    }); 

格式不需要与上面的示例完全相同,但重点是要创建key:value对,它们分别具有国家和属于各自大洲组的值。

有人可以让我知道怎么做吗?

1 个答案:

答案 0 :(得分:0)

已更新为使用d3.nest

d3.nest是d3的数据分组对象。您可以使用它来获得最有效的利用,然后执行快速转换:

var groups = d3.nest().key(d => d.continents).entries(rows),
    result = groups.map(function(d){
    return {
        continents: d.key,
        values: d.values
  };

这将产生类似的内容:

[{"continents":"Europe",
  "values":[
    {"continents":"Europe","countries":"Germany","values":"20"}, ...
  ],
 },
 {"continents":"Asia",
  "values": [...]
 }, ... ]

替代:使用d3.group

您可以使用d3.group(它是d3-array的一部分)来获得大部分的使用方式:

var groups = Array.from(d3.group(rows, d => d.continents));

然后您可以使用这些groups来获取所需的对象:

groups.map(function(d){
    return {
    continents: d[0],
      values: d[1]
    };
});