GoogleのVisualizationAPIを使用して、google.visualization.data.groupを使用して、生データに基づいてサブテーブルを作成します。私の生データは{v: "US"、f: "United States"}のトリックを使用して値以外のものを表示しますが、集計関数を使用すると、フォーマットが削除され、「US」部分のみが残ります。
元のフォーマットを保持する方法、またはグループ集計を使用して作成されたDataTableに元のフォーマットを追加する簡単な方法はありますか?
サンプルデータ:
[2010, {v:"MA", f:"Morocco"}, {v:"002", f:"Africa"}, {v:"002", f:"Northern Africa"}, 21.12724],
[2010, {v:"AW", f:"Aruba"}, {v:"019", f:"Americas "}, {v:"019", f:"Caribbean"}, 0.98],
[2010, {v:"AF", f:"Afghanistan"}, {v:"142", f:"Asia"}, {v:"142", f:"Southern Asia"}, 0.9861],
[2010, {v:"AO", f:"Angola"}, {v:"002", f:"Africa"}, {v:"002", f:"Middle Africa"}, 5.11774],
集計関数:
var countryData = google.visualization.data.group(
rawData,
[0, 1],
[{'column': 4, 'aggregation': google.visualization.data.sum, 'type': 'number'}]
);
編集:
さらに考えてみると、各値の形式が一貫しているという保証がないため、形式でグループ化することはおそらく不可能です。そのことを念頭に置いて、データの各列に形式を追加する関数を作成する方がおそらく良い(または可能である)でしょう。したがって、質問は「どうやってそれを行うのか」ということになります。
生データをフォーマットされていない値だけで作成したり、各値のフォーマットを検索するための追加のテーブルを作成したりするのは、実際には避けたいと思います。これには、追加の2つのテーブル(1つは28行のリージョン用、もう1つは240行を超える国用)が必要です。次に、グループ化されたテーブル(30年以上のデータが含まれる)の各値を調べる2つの関数を作成します。数千行を意味します)値を追加します。
それは本当に複雑な解決策のようです。
修飾子関数を使用してこれを行う方法はありますか?テーブル内の各値を{v: "US"、f: "United States"}形式のオブジェクトとして返す関数を記述できますか?または、元のテーブルで適切な値を検索してその形式を採用する列フォーマッターを作成する簡単な方法はありますか?私(それを書かなければならない人)とユーザー(それをロードしなければならない人)の両方にとって、どちらが最も頭痛の種になるでしょうか?
編集2:
次のようなものを使用して、新しいテーブルのフォーマッタを作成できるはずです。
function (dt, row) {
return {
v: (dt.getValue(row, 1) / 1000000),
f: (dt.getValue(row, 1) / 1000000) + 'M'
}
}
しかし、問題は、数値形式を扱っていないため、値を取得するある種のルックアップテーブルを作成し、それをルックアップテーブルで検索してから、適切な形式を返す必要があるということです。また、テーブル全体を1行ずつループする必要があるように見えます。これは数千行です。
力ずくのループと値の割り当てなしにこれを行う簡単な方法がないことは想像できません。
編集3:
だから私はトリッキーなことを試みました。各行を値/フォーマットとして設定するのではなく、値/フォーマット部分を文字列として作成し、グループ化した後、eval()を使用してオブジェクトを評価しました。これはうまくいきました。データは次のとおりです。
[2010, "{v: 'MA', f: 'Morocco'}", 21.13],
[2010, "{v: 'AW', f: 'Aruba'}", 0.98],
[2010, "{v: 'AF', f: 'Afghanistan'}", 0.99],
[2010, "{v: 'AO', f: 'Angola'}", 5.12],
新しいコードは次のとおりです。
var countryCount = countryData.getColumnRange(0).count;
for (var i = 0; i <= countryCount; i++) {
countryData.setValue(i, 1, eval('(' + countryData.getValue(i,1) + ')'));
};
問題は、これをGoogle DataTableに出力すると、evalで結果を適切にチェックすると次のようになるにもかかわらず、{v:'AE'、f:'アラブ首長国連邦'}と表示されることです。
>>> eval('(' + countryData.getValue(i,1) + ')')
Object v="AE" f="United Arab Emirates"
それで、私はここで何を間違っているのですか?