d3 анализ данных / конвертирование (от длинного к широкому) - PullRequest
1 голос
/ 08 июня 2019

У меня есть набор данных, который выглядит следующим образом в формате 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}
    }); 

Формат не обязательно должен быть точно таким же, как в примере выше, но смысл в том, чтобы создать пары ключ: значение со страной и значениями, которые принадлежат их соответствующей группе континентов.

Может кто-нибудь дать мне знать, как сделать?

1 Ответ

0 голосов
/ 08 июня 2019

Обновлено для использования 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]
    };
});
...