Суммирование на основе нескольких строк - PullRequest
2 голосов
/ 24 сентября 2019

У меня есть массивный CSV, который выглядит как

name      year     count
Sam       2012       3   
Mike      2012       4
Jeff      2013       5
.
.
.
Sam       2012       8  
Sam       2013       8       
Jeff      2013       9

Как использовать d3 для суммирования только если имя и год совпадают?Таким образом, вывод должен быть

name year sum
Jeff 2013  14
Sam  2012  11
Sam  2013  8
Mike 2012  4

Я пробовал это до сих пор

var test = d3.nest()
    .key(function(d) { return d.name })
    .key(function(d) { return d.year })
    .rollup(function(v) { total: d3.sum(v, function(d) { return d.count }) })
    .object(data);

, но это выводит итоговое значение как неопределенное.

1 Ответ

0 голосов
/ 25 сентября 2019

Прежде всего, вывод , описанный в вашем вопросе, - это не фактический вывод, который вы ищете, это просто структура, которую вы хотели бы иметь в CSV, чтобы вы могли получить желаемый результат:d3.csv, как и d3.csvParse (используется внутри), возвращает массив объектов .Это также относится к d3.tsv (CSV в вашем вопросе выглядит как TSV ... к счастью, это действительно не имеет значения, решение такое же, будь то CSV или TSV).

При этом, не используйте d3.nest, который в любом случае будет устаревшим.Вы также не можете использовать функцию строки, так как функции строки вызываются для каждой строки в CSV.Итак, простейшая альтернатива - использовать чистое решение JavaScript для создания новой структуры данных.

Например, использовать reduce:

const csv = `name,year,count
Sam,2012,3
Mike,2012,4
Jeff,2013,5
Sam,2012,8
Sam,2013,8
Jeff,2013,9`;

const data = d3.csvParse(csv, d3.autoType);

const newData = data.reduce(function(acc, curr) {
  const foundObject = acc.find(function(d) {
    return d.name === curr.name && d.year === curr.year;
  });
  if (foundObject) {
    foundObject.count += curr.count;
  } else {
    acc.push(curr)
  };
  return acc;
}, [])

console.log(newData);
<script src="https://d3js.org/d3.v5.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...