2016-04-27 8 views
0

Ich habe folgende CSV:Single Crossfilter Dimension und Gruppe auf zwei Spalten?

ccgcode,ccgname,metric,male,female 
06M,Great Yarmouth And Waveney,3,24,76 
05G,North Staffordshire,3,46,54 
... etc. 

Wie erhalte ich eine Sex Dimension die Schaffung eines dc.pieChart() zu fahren? Meine Frage bezieht sich speziell auf den Dimension und Group Aspekt von Crossfilter, und nicht, wie man das Tortendiagramm darstellt.

+0

Sie sollten wirklich Ihre Daten so transformieren, dass sie in einem mehr Crossfilter-freundlichen Format vorliegen. Sie sollten es ändern, um eine "Sex" -Dimension zu haben, die zum Beispiel Werte "M" oder "F" hat, und dann sollten Sie eine "Count" -Dimension mit dem Wert haben. –

+0

So haben granularere Daten. Ist das der einzige Weg? – Ciwan

+0

Die Granularität ist die gleiche wie die Menge an Informationen in den Daten nicht ändert. Es ist das Format, das anders ist. Es ist nicht der einzige Weg, aber es ist der beste Weg. Wenn Sie sie in separaten Spalten aufbewahren, werden Sie allerlei Probleme bekommen, während die relativ kleinen Probleme, die dadurch entstehen, dass Ihre Daten länger und nicht länger werden, bereits von Hilfs-Bibliotheken wie Reductio und Universe behandelt werden. –

Antwort

2

Crossfilter kann nicht einfach die zwei Spalten zusammenfassen, die Sie benötigen, so dass die Neuformatierung der Daten Ihre beste Wette ist (gemäß der Konversation in den Kommentaren). Sie können melt.js verwenden, was wie reshape funktioniert, wenn Sie mit R vertraut sind, so dass Sie Ihre Rohdaten nicht berühren müssen.

Diese Lösung setzt voraus, Ihre Daten eine Liste von Objekten mit Schlüssel-Wert-Paare (ziemlich Standard) ist:

data = [ 
    { ccgcode: '06M', ccgname: 'Great Yarmouth And Waveney', metric: 3, male: 24, female: 76 }, 
    { ccgcode: '05G', ccgname: 'North Staffordshire', metric: 3, male: 46, female: 54 }, 
...]; 

Sie wollen zunächst alle statischen Spalten identifizieren, die Sie nicht wollen, zu „schmelzen“ (disaggregieren):

var staticColumns = ['ccgcode', 'ccgname', 'metric']; 

Dann Sie melt verwenden männliche und weibliche Spalten Gruppierung aufheben. Melt nimmt in Ihren Daten, die Spalten, die Sie nicht wollen, zu schmelzen, und der Name der neuen Schmelzesäule (in Ihrem Fall ist es sex):

var ndx = crossfilter(melt(data, staticColumns, 'sex', 'count')); 
var sexDim = ndx.dimension(function (d) { return d.sex; }); 

Sie mit der folgenden Dimension am Ende:

sexDim = [ 
    { sex: 'male', count: 24, _id: 0, ccgcode: '06M', ccgname: 'Great Yarmouth And Waveney', metric: 3 }, 
    { sex: 'male', count: 46, _id: 1, ccgcode: '05G', ccgname: 'North Staffordshire', metric: 3}, 
    { sex: 'female', count: 76, _id: 0, ccgcode: '06M', ccgname: 'Great Yarmouth And Waveney', metric: 3 }, 
    { sex: 'female', count: 54, _id: 1, ccgcode: '05G', ccgname: 'North Staffordshire', metric: 3}, 
...]; 

Beachten Sie die hilfreiche _id, die melt für Sie erstellt, falls Sie alles wieder zusammenbinden müssen (obwohl Ihre statischen Spalten auch dabei helfen). Sie können false als fünften Parameter an melt übergeben, um die _id Eigenschaft auszuschließen.

Und Sie nach Geschlecht noch Gruppe kann:

var males = sexDim.group().reduceSum(function (d) { 
    if (d.sex === 'male') { 
    return d.count; 
    } else { 
    return 0; 
    } 
}); 

Hoffnung, das hilft!

Verwandte Themen