私は次のような巨大なcsvを持っています
name year count
Sam 2012 3
Mike 2012 4
Jeff 2013 5
.
.
.
Sam 2012 8
Sam 2013 8
Jeff 2013 9
名前と年の両方が同じである場合にのみカウントを合計するためにd3を使用するにはどうすればよいですか?したがって、出力は次のようになります。
name year sum
Jeff 2013 14
Sam 2012 11
Sam 2013 8
Mike 2012 4
私はこれまでこれを試しました
var test = d3.nest()
.key(function(d) { return d.name })
.key(function(d) { return d.year })
.rollup(function(v) { total: d3.sum(v, function(d) { return d.count }) })
.object(data);
ただし、これは合計を未定義として出力します。
まず第一に、出力あなたの質問で説明あなたはあなたが欲しいの出力を得ることができるので、あなたのCSVが持っていたいだけの構造だあなたが探している実際の出力は、ありません:d3.csv
のように、d3.csvParse
(内部的に使用)、返しますオブジェクトの配列。これも当てはまりd3.tsv
ます(質問のCSVはTSVのように見えます...幸い、それは実際には問題ではありません。解決策はCSVでもTSVでも同じです)。
そうは言っても、d3.nest
とにかくすぐに非推奨になる、を使用しないでください。また、CSV内のすべての行に対して行関数が呼び出されるため、行関数を使用することはできません。したがって、最も簡単な代替方法は、純粋なJavaScriptソリューションを使用して新しいデータ構造を作成することです。
たとえば、次を使用しreduce
ます。
const csv = `name,year,count
Sam,2012,3
Mike,2012,4
Jeff,2013,5
Sam,2012,8
Sam,2013,8
Jeff,2013,9`;
const data = d3.csvParse(csv, d3.autoType);
const newData = data.reduce(function(acc, curr) {
const foundObject = acc.find(function(d) {
return d.name === curr.name && d.year === curr.year;
});
if (foundObject) {
foundObject.count += curr.count;
} else {
acc.push(curr)
};
return acc;
}, [])
console.log(newData);
<script src="https://d3js.org/d3.v5.min.js"></script>
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加