2016-06-30 38 views
0

我使用d3.tsv来解析文件。我想将数据的一列(PValue列)中的所有零更改为该列中下一个最低的数字。我相信这样做的正确方法是使用访问器函数,但我的尝试迄今都失败了。d3.csv修改输入数据

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中执行类似以下操作时,出现错误,说'数据'在上面的代码中未定义。

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是一个简单的函数,它返回数组中的最小值。我打算使用这个值来替换PValue列中的所有0。非常感谢帮助!

+0

您需要最小值排除0,请看这里:http://stackoverflow.com/questions/29261994/use-d3-min-to-find-lowest-value-that -is而不是0。随着最小值只是当0出现 – Klaujesi

+0

@Klaujesi是的,我有替换零部件的问题。 –

回答

1

您可以先找到最小值,然后替换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把它作为字符串,并且您的比较将失败.-

+1

谢谢,当我用d.PValue替换d.Data时,这工作得很好。 –

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; })); 
    }); 
})