我有一个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.csv
和map
进行解析时,数据如下所示:
[
{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对,它们分别具有国家和属于各自大洲组的值。
有人可以让我知道怎么做吗?
答案 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]
};
});