2017-08-10 6 views
2

私はある期間にわたって公開されたファンフィクションのCSVを持っています。それは次のようになります。d3のキー関数はリスト要素を扱うことができますか?

id,published_date,characters 
1,2017-01-01,'['Joe','Bob','Mary']' 
2,2017-01-02,'['Mary']' 
3,2017-01-02,'['Bob','Mary']' 

私はpublished_dateによってキーの機能を書いてかなり良い成功を収めたが、今私はcharactersためのキー機能を書くことができるかどうかを確認したいです。したがって、最初の行では、Joe、Bob、Maryはいずれも値が2017-01-01のキーであり、2番目の行では2017-01-02がMaryのキーに追加されます。最後に、rolluppublished_dateに送信して、各日付のMaryについて公開されたファンフィクションの数を取得したいと思います。私は、エンドデータは次のようになりますと思う:

{ 
Bob: {2017-01-01: 1}, {2017-01-02: 1}, 
Joe: {2017-01-01: 1}, 
Mary: {2017-01-01: 1}, {2017-01-02: 2} 
} 

だからpublished_dateのために、私のコードは次のように見えた:

var dates = d3.nest() 
       .key(function(d) { return parseDate(d.published_date); }) 
       .rollup(function(v) { return v.length; }) 
       .entries(csv_data); 

そして、私のcharacters列がリストでなかったならば、私はこれがうまくいくと信じて:

var dates = d3.nest() 
       .key(function(d) { return d.characters; }) // key by character 
       .key(function(d) { return parseDate(d.published_date); }) 
       .rollup(function(v) { return v.length; }) 
       .entries(csv_data); 

は、私が実際に複数のキーを作成するためにkey(function(d) { return d.characters; })を変えることができる方法はありますか?

ありがとうございます!

答えて

2

データをアンスタックして、正しい答えを得ました。

var csv = `id,published_date,characters 
    1,2017-01-01,"[Joe,Bob,Mary]" 
    2,2017-01-02,"[Mary]" 
    3,2017-01-02,"[Bob,Mary]"`; 

var csvData = d3.csvParse(csv, function(r) { 
    return { 
    id: +r.id, 
    publishedDate: new Date(r.published_date), 
    characters: r.characters.slice(1,-1).split(",") 
    }; 
}); 

var data = []; 
csvData.forEach(function(r) { 
    r.characters.forEach(function(c) { 
    data.push({ 
     id: r.id, 
     publishedDate: r.publishedDate, 
     character: c 
    }); 
    }); 
}); 

これで、これはあなたの望むように動作します。

var nested = d3.nest() 
    .key(function(d) { return d.character; }) 
    .key(function(d) { return d.publishedDate; }) 
    .rollup(function(v) { return v.length }) 
    .entries(data); 
関連する問題