データのグループ化
離散値をグループ化する。
group(iterable, ...keys)
例 · ソース · 指定された値の *iterable* を、*key* から値の配列への InternMap にグループ化します。たとえば、 *ペンギン* サンプルデータセットを *種* フィールドでグループ化するには、次のようにします。
const species = d3.group(penguins, (d) => d.species);
*種* フィールドが *アデリー* である要素を取得するには、次のようにします。
species.get("Adelie") // Array(152)
複数の *key* が指定されている場合、ネストされた InternMap が返されます。例えば
const speciesSex = d3.group(penguins, (d) => d.species, (d) => d.sex)
種が *アデリー* で性別が *メス* であるペンギンを取得するには、次のようにします。
speciesSex.get("Adelie").get("FEMALE") // Array(73)
要素は、各 *key* の最初のインスタンスの順序で返されます。
groups(iterable, ...keys)
const species = d3.groups(penguins, (d) => d.species); // [["Adelie", Array(152)], …]
group と同等ですが、マップではなく [ *key* 、 *value* ] エントリの配列を返します。複数の *key* が指定されている場合、各 *value* は [ *key* 、 *value* ] エントリのネストされた配列になります。要素は、各 *key* の最初のインスタンスの順序で返されます。
rollup(iterable, reduce, ...keys)
例 · ソース · 指定された値の *iterable* をグループ化し、*key* から削減された値への InternMap に削減します。たとえば、 *ペンギン* サンプルデータセットを *種* フィールドでグループ化してカウントするには、次のようにします。
const speciesCount = d3.rollup(penguins, (D) => D.length, (d) => d.species);
種が *アデリー* であるペンギンの数を取得するには、次のようにします。
speciesCount.get("Adelie") // 152
複数の *key* が指定されている場合、ネストされた InternMap が返されます。例えば
const speciesSexCount = d3.rollup(penguins, (D) => D.length, (d) => d.species, (d) => d.sex);
種が *アデリー* で性別が *メス* であるペンギンの数を取得するには、次のようにします。
speciesSexCount.get("Adelie").get("FEMALE") // 73
要素は、各 *key* の最初のインスタンスの順序で返されます。
rollups(iterable, reduce, ...keys)
const speciesCounts = d3.rollups(penguins, (D) => D.length, (d) => d.species); // [["Adelie", 152], …]
rollup と同等ですが、マップではなく [ *key* 、 *value* ] エントリの配列を返します。複数の *key* が指定されている場合、各 *value* は [ *key* 、 *value* ] エントリのネストされた配列になります。要素は、各 *key* の最初のインスタンスの順序で返されます。
index(iterable, ...keys)
各グループから最初の要素を抽出するリデューサーでrollupを使用し、グループに複数の要素がある場合はエラーをスローします。たとえば、 *aapl* 同じデータセットを日付でインデックス化するには、次のようにします。
const aaplDate = d3.index(aapl, (d) => d.Date);
その後、日付で値をすばやく取得できます。
aaplDate.get(new Date("2013-12-31")).Close // 80.145714
要素は入力順に返されます。
indexes(iterable, ...keys)
index と同様ですが、マップではなく [ *key* 、 *value* ] エントリの配列を返します。これはおそらく何の役にも立ちませんが、groups および rollups との対称性のために含まれています。
flatGroup(iterable, ...keys)
例 · ソース · group と同等ですが、ネストされたマップではなく [ *key0* 、 *key1* 、…、 *values* ] のフラット配列を返します。すべてのグループを反復処理するのに役立ちます。
flatRollup(iterable, reduce, ...keys)
例 · ソース · rollup と同等ですが、ネストされたマップではなく [ *key0* 、 *key1* 、…、 *value* ] のフラット配列を返します。すべてのグループを反復処理するのに役立ちます。
groupSort(iterable, comparator, key)
例 · ソース · 指定された *key* 関数に従って指定された *iterable* の要素をグループ化し、指定された *comparator* に従ってグループをソートし、ソートされた順序でキーの配列を返します。たとえば、 *ペンギン* サンプルデータセットの種を、中央値の体重の昇順で並べ替えるには、次のようにします。
d3.groupSort(penguins, (D) => d3.median(D, (d) => d.body_mass_g), (d) => d.species) // ["Adelie", "Chinstrap", "Gentoo"]
降順にするには、グループ値を否定します。
d3.groupSort(penguins, (D) => -d3.median(D, (d) => d.body_mass_g), (d) => d.species) // ["Gentoo", "Adelie", "Chinstrap"]
*accessor* の代わりに *comparator* が渡された場合(つまり、2 番目の引数がちょうど 2 つの引数を取る関数である場合)、2 つのグループ *a* と *b* を比較するように求められ、 *a* が *b* の前にある場合は負の値を、 *a* が *b* の後にある場合は正の値を、部分的な順序付けの場合はゼロを返す必要があります。