d3 о том, как суммировать значения

#javascript #d3.js

#javascript #d3.js

Вопрос:

У меня есть данные ниже:

 [
  { id: 0, Department: "Civil", Value: "40000", Title:"Sustainability", ComID: "45", organisation: { City: "New York", ComID: 45, Country: "USA" } },
  { id: 1, Department: "Energy", Value: "82000", Title: "Wind Energy", ComID: "62", organisation: { City: "Paris" , ComID: 62, Country: "France" } },
  { id: 2, Department: "Medical", Value: "67000", Title: "Neuroscience", ComID: "21", organisation: { City: "Berlin", ComID: 21, Country: "Germany" } },
  { id: 3, Department: "Computer", Value: "100000", Title: "Security", ComID: "67", organisation: { City: "Amsterdam", ComID: 67, Country: "Holland" } }
]
  

данные представляют собой массив примерно из 100 объектов, подобных приведенным выше.

В данных у меня есть организации из той же страны. Я хочу суммировать атрибут Value каждой страны и поместить его в новую таблицу.

Например, я хотел бы создать:

 [ { Name: "each Country", Value: "the summed value" } ]
  

Ответ №1:

Отредактировано, чтобы ответить на обновленный вопрос

Вы можете использовать d3.nest() для группировки объектов по заданному ключу (в данном случае по стране), а затем «свернуть их», чтобы суммировать значения по каждому из элементов, принадлежащих к данной стране. В вашем случае однострочный текст выглядел бы примерно так:

 d3.nest().key(function(d){
    return d.organisation.Country; })
.rollup(function(leaves){
    return d3.sum(leaves, function(d){
        return d.Value;
    });
}).entries(data)
.map(function(d){
    return { Country: d.key, Value: d.values};
});
  

Здесь я использую d3.sum , передавая функцию доступа, чтобы указать, что вы хотите суммировать Value для каждого элемента:

Это возвращает четыре объекта в вашем примере данных:

 [{"Country":"USA","Value":40000},
 {"Country":"France","Value":82000},
 {"Country":"Germany","Value":67000},
 {"Country":"Holland","Value":100000}]
  

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

 var data = [ { id:0,Department: "Civil",Value : "40000",Title :"Sustainability",ComID : "45", organisation:{ City:"New York",ComID:"45",Country: "USA"}}, { id:1,Department: "Energy",Value : "82000",Title : "Wind Energy",ComID : "62", organisation:{ City:"Paris",ComID:"62",Country: "France"}}, { id:2,Department: "Medical",Value : "67000",Title : "Neuroscience",ComID : "21", organisation:{ City:"Berlin",ComID:"21",Country: "Germany"}}, { id:3,Department: "Computer",Value : "100000",Title : "Security",ComID : "67", organisation:{ City:"Amsterdam",ComID:"67",Country: "Holland"}}]
  

Комментарии:

1. да, я пробовал с d3.sum, но ничего. У меня есть разные страны в данных, и я хочу суммировать значения каждой страны и поместить их в новую таблицу, где я мог бы иметь, например. новые данные [ { Страна: » «, Значение: «суммированные значения»}]

2. Можете ли вы обновить свой вопрос и опубликовать больше своих данных, чтобы было ясно, что вы пытаетесь сделать?

3. @AkisIoannou: Я обновил свой ответ, но опубликованные вами данные по-прежнему отформатированы неправильно.

4. Также эта ссылка может быть полезной bl.ocks.org/phoebebright/3176159 Спасибо за приведенный выше пример, это была отличная помощь.

Ответ №2:

Поскольку d3-collection он устарел в пользу d3.array , мы можем использовать d3.rollups для достижения того, что раньше работало с d3.nest :

 d3
  .rollups(
    data,
    xs => d3.sum(xs, x => x.Value),
    d => d.organisation.Country
  )
  .map(([k, v]) => ({ Country: k, Value: v }))
  

Это:

  • Применяет d3.rollups :
    • d3.rollups принимает 3 параметра: входной массив, функцию уменьшения и функцию группировки
    • d => d.organisation.Country группирует элементы по Country
    • xs => d3.sum(xs, x => x.Value) уменьшает сгруппированные значения, извлекая их значение и суммируя их с помощью d3.sum
  • Форматирует выходные данные свертки, чтобы получить ожидаемый результат (преобразование карты).

 var data = [
  { id: 0, Department: "Civil", Value: "40000", Title:"Sustainability", ComID: "45", organisation: { City: "New York", ComID: 45, Country: "USA" } },
  { id: 1, Department: "Energy", Value: "82000", Title: "Wind Energy", ComID: "62", organisation: { City: "Paris" , ComID: 62, Country: "France" } },
  { id: 2, Department: "Medical", Value: "67000", Title: "Neuroscience", ComID: "21", organisation: { City: "Berlin", ComID: 21, Country: "Germany" } },
  { id: 3, Department: "Computer", Value: "100000", Title: "Security", ComID: "67", organisation: { City: "Amsterdam", ComID: 67, Country: "Holland" } }
];

var output =
  d3.rollups(
      data,
      xs => d3.sum(xs, x => x.Value),
      d => d.organisation.Country
    )
    .map(([k, v]) => ({ Country: k, Value: v }))

console.log(output);  
 <script src="https://d3js.org/d3-array.v2.min.js"></script>