【问题标题】:Summing based on multiple rows基于多行求和
【发布时间】:2019-09-24 19:53:38
【问题描述】:

我有一个巨大的 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);

但这会将总数输出为未定义。

【问题讨论】:

    标签: javascript database csv d3.js


    【解决方案1】:

    首先,您的问题中描述的 输出 不是您要查找的实际输出,这只是您希望 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>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      相关资源
      最近更新 更多