【问题标题】:Can I normalise CSV data with D3?我可以用 D3 规范化 CSV 数据吗?
【发布时间】:2017-07-01 18:12:02
【问题描述】:

我的原始 CSV 中有此类数据:

id, lat, long, data_type_1, data_type_2, data_type_3
1 , 50,  1,    10,          20,          40

而我需要把它改造成这种结构:

id, lat, long, data_type, value,
1 , 50,  1,    1,          10,
1 , 50,  1,    2,          20,
1 , 50,  1,    3,          40,

我查看了 d3.csvquestion 或两个的 devdocs。

我有这段代码,从这个 bl.ocks.org 页面压缩/修改。

d3.csv("traffic_data.csv", function(d) {
                numericColHeaders.forEach(header => d[header] = parseInt(d[height]));
                console.error(d); // to inspect in the console
                return d;
            }, function(error, data) {
                if (error) throw error;
                var root = d3.stratify()
                    .id(function(d) {
                        return d.data_type;
                    })
                    .parentId(function(d) {
                        return d.id;
                    })
                    (data)
                    .sum(function(d) {
                        return d.value;
                    })
                    .sort(function(a, b) {
                        return b.height - a.height || b.value - a.value;
                    });

                treemap(root);
                // do more stuff
            })

当我控制台输出数据时,它会打印一行,但要使我的数据标准化,我需要将其“扩展”成多行,我不知道如何做到这一点.我想不出如何用mapfilterreduce 来做到这一点。如果有什么我想要减少的反面。

我怎样才能做到这一点?

【问题讨论】:

  • 您需要将 CSV 中的每条记录转换为 3 条记录(每个 data_type 一条。您希望将 push() 它们转换为一个新的数据数组并在您的可视化中使用它
  • @genestd 在 csv 函数或回调中?如果它在 csv 函数中,我将得到嵌套数组...
  • 在回调中执行,然后将新变量作为(data) 传递给您的stratify() 函数

标签: javascript csv d3.js


【解决方案1】:

您可以在不使用 D3 的情况下使用内置的 mapreduce 函数来执行此操作,如下所示:

rows.map(row => {
  const { id, lat, long, data_type_1, data_type_2, data_type_3 } = row

  return [
    {
      id, lat, long,
      data_type: '1',
      value: data_type_1
    },
    {
      id, lat, long,
      data_type: '2',
      value: data_type_2
    },
    {
      id, lat, long,
      data_type: '3',
      value: data_type_3
    }
  ]
}).reduce((prev, next) => prev.concat(next), [])

long 是一个保留字,这段代码不会完全起作用。但应该给你正确的想法。

【讨论】:

  • 是的,它不包含任何解析 csv 的代码。它希望它已经被解析为一个对象列表,其中键是列标题
猜你喜欢
  • 2018-01-27
  • 2012-08-09
  • 2013-04-22
  • 2021-01-20
  • 2014-04-01
  • 2016-08-31
  • 2020-02-03
  • 1970-01-01
  • 2020-05-08
相关资源
最近更新 更多