d3.csv修改输入数据
d3.csv modifying the input data
我正在使用 d3.tsv 来解析文件。我想将数据(PValue 列)的一列中的所有零更改为该列中的下一个最小数字。我相信这样做的正确方法是使用访问器函数,但我的尝试到目前为止都失败了。
d3.tsv(filename, modifyData, function(error, data) {
data.forEach(function(d) {
d.NAME = d.NAME;
d.logFC = +d.logFC;
d.logCPM = +d.logCPM;
d.FDR = +d.FDR;
d.PValue = +d.PValue
});
})
当我尝试在访问器函数 modifyData 中执行类似以下操作时,我收到一条错误消息,提示 'data' 在上面的代码中未定义。
function modifyData(d){
d.forEach(function(origData){
origData.PValue = +origData.PValue
pValue_array.push(origData.PValue)
})
var pValue_array = []
for (var i = pValue_array.length-1 ; i >= 0; i--){
if (pValue_array[i] === 0){
pValue_array.splice(i,1);
}
}
var newPzero = (arrayMin(pValue_array))
return d;
};
arrayMin 是一个简单的函数,它 returns 数组中的最小值。我正计划使用这个值来替换 PValue 列中的所有 0。非常感谢您的帮助!
您可以使用 d3.min 从您的数据集中获取最小值。
例如
d3.tsv(filename, function(error, data) {
data.forEach(function(d) {
d.NAME = d.NAME;
d.logFC = +d.logFC;
d.logCPM = +d.logCPM;
d.FDR = +d.FDR;
d.PValue = +(d.PValue || d3.min(data, function(d) { return d.PValue || Infinity; }));
});
})
可以先求最小值再替换0:
d3.tsv('data.tsv', function(error, data) {
//Option A
// smallest = d3.min(data, function(d) {return +d.PValue || Infinity; })
//Option B
var noZeroes = data.filter(function(d) { return +d.Data !== 0; });
var smallest = d3.min(noZeroes, function(d) { return d.Data; })
data.forEach(function(d) {
d.NAME = d.NAME;
d.logFC = +d.logFC;
d.logCPM = +d.logCPM;
d.FDR = +d.FDR;
if (+d.PValue == 0 ) {
d.Data = +smallest;
} else {
d.PValue = +d.PValue
}
});
console.table(data);
})
不要忘记数字值的“+”,否则JS认为它是字符串,你的比较会失败。-
我正在使用 d3.tsv 来解析文件。我想将数据(PValue 列)的一列中的所有零更改为该列中的下一个最小数字。我相信这样做的正确方法是使用访问器函数,但我的尝试到目前为止都失败了。
d3.tsv(filename, modifyData, function(error, data) {
data.forEach(function(d) {
d.NAME = d.NAME;
d.logFC = +d.logFC;
d.logCPM = +d.logCPM;
d.FDR = +d.FDR;
d.PValue = +d.PValue
});
})
当我尝试在访问器函数 modifyData 中执行类似以下操作时,我收到一条错误消息,提示 'data' 在上面的代码中未定义。
function modifyData(d){
d.forEach(function(origData){
origData.PValue = +origData.PValue
pValue_array.push(origData.PValue)
})
var pValue_array = []
for (var i = pValue_array.length-1 ; i >= 0; i--){
if (pValue_array[i] === 0){
pValue_array.splice(i,1);
}
}
var newPzero = (arrayMin(pValue_array))
return d;
};
arrayMin 是一个简单的函数,它 returns 数组中的最小值。我正计划使用这个值来替换 PValue 列中的所有 0。非常感谢您的帮助!
您可以使用 d3.min 从您的数据集中获取最小值。
例如
d3.tsv(filename, function(error, data) {
data.forEach(function(d) {
d.NAME = d.NAME;
d.logFC = +d.logFC;
d.logCPM = +d.logCPM;
d.FDR = +d.FDR;
d.PValue = +(d.PValue || d3.min(data, function(d) { return d.PValue || Infinity; }));
});
})
可以先求最小值再替换0:
d3.tsv('data.tsv', function(error, data) {
//Option A
// smallest = d3.min(data, function(d) {return +d.PValue || Infinity; })
//Option B
var noZeroes = data.filter(function(d) { return +d.Data !== 0; });
var smallest = d3.min(noZeroes, function(d) { return d.Data; })
data.forEach(function(d) {
d.NAME = d.NAME;
d.logFC = +d.logFC;
d.logCPM = +d.logCPM;
d.FDR = +d.FDR;
if (+d.PValue == 0 ) {
d.Data = +smallest;
} else {
d.PValue = +d.PValue
}
});
console.table(data);
})
不要忘记数字值的“+”,否则JS认为它是字符串,你的比较会失败。-