我有一个CSV文件,其中包含100行(作为案例)和1100列(作为功能) (每个案例有1100个功能)。
我想使用20列(比如55-74)并将其可视化而不是1100列。如何选择这些数据(100 x 20)并在我的代码中使用它?
答案 0 :(得分:1)
从理论上讲,这可以做到......
您可以使用访问器功能创建仅包含指定范围的20列的输出数据:
d3.csv('path/to/your/file.csv')
// this is run once for each row of your data
.row(function accessor(d) {
// make an array of all the keys (1100 of them)
var keys = d3.map(d).keys();
// create an empty object
var outputDatum = {};
// fill it with the key/value pairs from indexes 55 - 74
for (var i = 55; i < 75; i++) {
outputDatum[keys[i]] = d[keys[i]];
}
// return the object you built
return outputDatum;
})
// this is the callback that runs when the data is ready
.get(function callback(error, data) {
// use the data to make something
});
问题是,如果不知道这些密钥的名称是什么,它们可能对您没什么用处。此外,在这些神秘的20列中存储了什么样的值?它们都是同一类型吗?
您在技术上仍然可以使用这些值,例如:
function callback(error, data) {
d3.selectAll('div')
.data(data)
.enter().append('div')
.text(function(d) { return d3.values(d)[6]; }
}
这将创建包含每行第7列中的值的div ...除了不完全相同,因为对象键/值对不是以定义的顺序存储或检索的。
您可能需要重新考虑数据的结构。如果列的索引比它们的名称更相关,那么它们应该是你的行。
<强>更新强>
如果您知道您感兴趣的列的标签,那么这会使问题变得更加简单。然后,您可以使用访问器功能输出所选数据,如下所示:
d3.csv('path/to/your/file.csv')
.row(function(d) {
return {
x: d.featureX,
y: d.featureY,
z: d.featureZ
};
})
.get(function(e, data) {
d3.selectAll('div')
.data(data)
.enter().append('div')
.text(function(d) { return d.x; });
});
这一次,访问者函数为您提供了返回数据,其中包含属性x
,y
和z
,表示调用的原始数据(对于此示例)featureX
,featureY
和featureZ
。然后,此示例将为每行的featureX创建一个div。