d3数据parse/convert(从长到宽)
d3 data parse/convert (from long to wide)
我有一个 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 与属于各自大陆组的国家和值配对。
谁能告诉我怎么做?
已更新为使用 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
, which is part of d3-array
:
var groups = Array.from(d3.group(rows, d => d.continents));
然后您可以使用这些 groups
来获取您想要的对象:
groups.map(function(d){
return {
continents: d[0],
values: d[1]
};
});
我有一个 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 与属于各自大陆组的国家和值配对。
谁能告诉我怎么做?
已更新为使用 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
, which is part of d3-array
:
var groups = Array.from(d3.group(rows, d => d.continents));
然后您可以使用这些 groups
来获取您想要的对象:
groups.map(function(d){
return {
continents: d[0],
values: d[1]
};
});