2014-11-25 110 views
0

我讀一個CSV文件,需要計算使用D3.js或普通的JavaScript從這個數據的兩個數字:計算最大

這也許可以在一個步驟中完成,但我已經打破下來了解釋的目的:

一旦我的數據被讀取,我需要通過每一列的迭代,標有「一」到「十」 (在這個數據的長度是未知的長度,所以它可能會高達十二或二十),

...每次乘以「multiplier」之後的每列乘以稱爲「mult」的變量iplier「 (在數據中,我給出了1.5,1,5,5的任意值,使視覺更清晰)。

這給出了一個新的數字網格,從1到n的每個ID必須計算這些新數字中的每一個的最大分數和最小分數。所以每個ID都會有一個最大值和最小值。我需要知道作爲變量返回的整個數據中這些新分數的最大值和最小值。

數據在讀:

d3.csv("data.csv", function(csv) { var mydata = bars .selectAll("rect") .data(csv) .enter()};

的示例數據顯示爲:

ID,總,mutiplier,一,二,三,四,五,六,七,八,九,十 1,16500,1.5,0.362,0.37, 0.1,0.101,0.035,0.362,0.37,0.1,0.101,0.035 2,61000,1,0.426,0.382,0.115,0.084,0.053,0.426,0.382,0.115,0.084,0.053 3,48700,1.5,0.156, 0.531,0.195,0.399,0.14,0.156,0.149,0.106,0.399,0.14 4,33000,0.5,0.462,0.409,0.149,0.106,0.149,0.106,0.085,0.1,0.106,0.051 5,8000,0.5, 0.327,0.316,0.085,0.1,0.085,0.1,0.057,0.245,0.1,0.057 6,12760,1,0.149,0.195,0.057,0.245,0.057,0.245,0.119,0.114,0.245,0.08

這個原始數據不能被替換,因爲我稍後會參考它。

從這個數據

所以,通過所有列迭代,並採取從每個最大值和最小值整個數據之後---最小值爲0.003535,最大爲3.8875575

...我需要的函數返回一個var min和var max用於下一次計算。

希望有人能幫助!

回答

0

可以將數據作爲文本加載的一種方法,後者使用d3.csv.parseRows將CSV作爲數組數組進行分析。所以只需要切片,忽略前3列。

d3.text('data.csv', function(text) 
{ 
    var rows = d3.csv.parseRows(text, function(row, index) 
    { 
    // skip header, coerce to Number values 
    if(index > 0) 
    { 
     return row.map(Number); 
    } 
    }); 
    var extent = rows.reduce(function(result, row) 
    { 
    return d3.extent(result.concat(row.slice(3).map(function(value) 
    { 
     return value * row[2]; 
    }))); 
    }, [NaN, NaN]); 
    var min = extent[0]; 
    var max = extent[1]; 
}); 

其他方式如果數組對象更方便以後繪製結構,可以做以下操作。

var nonMeasureColumns = {'ID': 0, 'total': 0, 'multiplier': 0}; 
d3.csv('data.csv') 
    .row(function(row) 
    { 
    for(var key in row) 
    { 
     row[key] = Number(row[key]); 
    } 
    return row; 
    }) 
    .get(function(error, rows) 
    { 
    var extent = rows.reduce(function(result, row) 
    { 
     return d3.extent(result.concat(d3.map(row).entries() 
     .filter(function(entry) 
     { 
      return !(entry.key in nonMeasureColumns); 
     }) 
     .map(function(entry) 
     { 
      return entry.value * row['multiplier']; 
     }) 
    )); 
    }, [NaN, NaN]); 
    var min = extent[0]; 
    var max = extent[1]; 
    });