【发布时间】:2018-06-18 04:04:38
【问题描述】:
我想知道当我读入数据时,在 D3 或纯 JavaScript 中是否有任何方法可以即时检查数据类型。
例如,如果我想在使用 d3.csv() 制作箱线图时读取"iris.csv",有没有办法检查sepal_length、sepal_width、petal_length 和petal_width是数字变量,而species 是分类变量?
【问题讨论】:
标签: javascript csv d3.js
我想知道当我读入数据时,在 D3 或纯 JavaScript 中是否有任何方法可以即时检查数据类型。
例如,如果我想在使用 d3.csv() 制作箱线图时读取"iris.csv",有没有办法检查sepal_length、sepal_width、petal_length 和petal_width是数字变量,而species 是分类变量?
【问题讨论】:
标签: javascript csv d3.js
让我们看看一种可能的解决方案,使用您链接的 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>
【讨论】: