Javascript d3数据解析/转换(从长到宽)
我有一个类似csv格式的数据集:Javascript d3数据解析/转换(从长到宽),javascript,d3.js,dataformat,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 E
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}
});
格式不需要与上面的示例完全相同,但要点是将键:值与属于各自大陆组的国家和值配对
有人能告诉我如何制作吗?更新为使用
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.分组
另一种方法是利用现有的大部分方法,这是以下方法的一部分:
然后,您可以使用这些组
来获取所需的对象:
groups.map(function(d){
return {
continents: d[0],
values: d[1]
};
});
您好@mdml,谢谢您的回答。这似乎是有道理的,我试过了,但我不断地得到一个错误,“TypeError:d3.group不是一个函数”。你对这个错误有什么想法吗?除了上面的问题,你能建议一些解决方法以防d3.group不适合我吗?一些纯JS也可以。@Jamie:我已经更新为使用
d3.nest
,因为d3.group
只是d3数组的一部分。非常感谢您的回复。这真的帮助我理解了它。这就是我要找的。我还有一个问题,如果数据由两组嵌套在两个级别上会怎么样?例如,还有一个col,gender,数据按大陆和国家嵌套。那么,地图将如何工作以具有相同的格式,{大陆:{国家:{男性:值,女性:值}}}我建议您作为另一个问题提问,尽管如果我理解正确,您似乎可以使用两个键。
groups.map(function(d){
return {
continents: d[0],
values: d[1]
};
});