【问题标题】:How to check the type of value in a CSV with d3.csv()?如何使用 d3.csv() 检查 CSV 中值的类型?
【发布时间】:2018-06-18 04:04:38
【问题描述】:

我想知道当我读入数据时,在 D3 或纯 JavaScript 中是否有任何方法可以即时检查数据类型。

例如,如果我想在使用 d3.csv() 制作箱线图时读取"iris.csv",有没有办法检查sepal_lengthsepal_widthpetal_lengthpetal_width是数字变量,而species 是分类变量?

【问题讨论】:

    标签: javascript csv d3.js


    【解决方案1】:

    让我们看看一种可能的解决方案,使用您链接的 CSV:

    sepal_length,sepal_width,petal_length,petal_width,species
    5.1,3.5,1.4,0.2,setosa
    4.9,3.0,1.4,0.2,setosa
    4.7,3.2,1.3,0.2,setosa
    4.6,3.1,1.5,0.2,setosa
    etc...
    

    您不能立即执行typeof,因为d3.csv 会将所有内容转换为字符串:

    d3.csv("https://gist.githubusercontent.com/curran/a08a1080b88344b0c8a7/raw/d546eaee765268bf2f487608c537c05e22e4b221/iris.csv", function(data) {
      var variables = data.columns;
      variables.forEach(function(d) {
        console.log("typeof " + d + ": " + typeof(data[1][d]))
      })
    })
    <script src="https://d3js.org/d3.v4.min.js"></script>

    但是,我们可以使用isNaN 来检查该字符串是否包含数字(警告:这将无法与null 或空字符串一起正常工作):

    d3.csv("https://gist.githubusercontent.com/curran/a08a1080b88344b0c8a7/raw/d546eaee765268bf2f487608c537c05e22e4b221/iris.csv", function(data) {
      var variables = data.columns;
      variables.forEach(function(d) {
        console.log(d + " is: " + (isNaN(data[0][d]) ? "categorical" : "numeric"))
      })
    })
    <script src="https://d3js.org/d3.v4.min.js"></script>

    如您所见,我们只需要data.columns 来获取标题,然后我们只需要第一行值(这是data[1],而不是data[0])。实际上,除了第一行 (data[0]) 之外的任何行都可以使用。

    编辑

    你在comments提问:

    您对如何处理数据集中的缺失值/空字符串或空字符串有更深入的了解吗?

    一种简单的方法是检查该值是否为假...

    !data[index][d]
    

    ...然后转到下一行,直到找到合适的值:

    var index = 1;
    while (data[index][d] === "null" || data[index][d] === "") {
        ++index;
    }
    

    这里是演示,我在CSV中放了一些nulls和空字符串,看看:

    var csv = `sepal_length,sepal_width,petal_length,petal_width,species
    null,,null,0.2,setosa
    null,3.0,1.4,,setosa
    null,3.2,1.3,0.2,null
    4.6,3.1,1.5,0.2,setosa
    5.1,3.5,1.7,0.2,setosa`;
    
    var data = d3.csvParse(csv);
    
    var variables = data.columns;
    variables.forEach(function(d) {
      var index = 1;
      while (data[index][d] === "null" || data[index][d] === "") {
        ++index;
      }
      console.log(d + " is: " + (isNaN(data[index][d]) ? "categorical" : "numeric"))
    })
    <script src="https://d3js.org/d3.v4.min.js"></script>

    【讨论】:

    • 非常感谢。现在这是完美的;然而;您对如何处理数据集中的缺失值/空字符串或空字符串有更深入的了解吗? (或者我应该创建一个新线程?)
    • @bensw 无需发布新问题,只需检查编辑即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    相关资源
    最近更新 更多