web-dev-qa-db-ja.com

クロスフィルターのreduceAdd、reduceSum、reduceRemove関数とは何ですか?それらはどのように使用されるべきですか?

誰かがその引数reduceAddreduceSumreduceRemovecrossfilterでどのように機能するかを簡単な言葉で説明できますか?

31
Navya R

Map reduceは、特定の次元のキーによってデータセットを削減することに注意してください。たとえば、レコードでクロスフィルターインスタンスを使用するとします。

_[
    { name: "Gates",      age: 57,   worth: 72000000000, gender: "m" },
    { name: "Buffet",     age: 59,   worth: 58000000000, gender: "m" },
    { name: "Winfrey",    age: 83,   worth:  2900000000, gender: "f"   },
    { name: "Bloomberg",  age: 71,   worth: 31000000000, gender: "m"  },
    { name: "Walton",     age: 64,   worth: 33000000000, gender: "f"  },
]
_

ディメンションの名前、年齢、価値、性別。 reduceメソッドを使用して性別の次元を減らします。

最初に、reduceAdd、reduceRemove、reduceInitialコールバックメソッドを定義します。

reduceInitialは、縮小されたオブジェクトの形式と初期値を持つオブジェクトを返します。パラメータは必要ありません。

_function reduceInitial() {
    return {
        worth: 0,
        count: 0
    };
}
_

reduceAddは、レコードが特定のキーの縮小されたオブジェクトに「フィルタリング」されたときに何が起こるかを定義します。最初のパラメータは、削減されたオブジェクトの一時的なインスタンスです。 2番目のオブジェクトは現在のレコードです。このメソッドは、拡張された一時的に削減されたオブジェクトを返します。

_function reduceAdd(p, v) {
    p.worth = p.worth + v.worth;
    p.count = p.count + 1;
    return p;
}
_

reduceRemovereduceAddの逆を行います(少なくともこの例では)。 reduceAddと同じパラメーターを取ります。これは、レコードがフィルタリングされるとグループ削減が更新され、以前に計算されたグループ削減からレコードを削除する必要がある場合があるために必要です。

_function reduceRemove(p, v) {
    p.worth = p.worth - v.worth;
    p.count = p.count - 1;
    return p;
}
_

Reduceメソッドを呼び出すと、次のようになります。

_mycf.dimensions.gender.reduce(reduceAdd, reduceRemove, reduceInitial)
_

削減された値を確認するには、allメソッドを使用します。上位n個の値を表示するには、top(n)メソッドを使用します。

_mycf.dimensions.gender.reduce(reduceAdd, reduceRemove, reduceInitial).all()
_

返される配列は次のようになります(する必要があります)。

_[
    { key: "m", value: { worth: 161000000000, count: 3 } },
    { key: "f", value: { worth:  35000000000, count: 2 } },
]
_

データセットを削減する目的は、最初に共通キーでレコードをグループ化し、次にそれらのグループ化を各キーの単一の値に削減することにより、新しいデータセットを導出することです。この場合、性別でグループ化し、同じキーを共有するレコードの値を追加することで、そのグループの価値のある次元を削減しました。

他のreduceXメソッドは、reduceメソッドの便利なメソッドです。

この例では、reduceSumが最も適切な置換です。

_mycf.dimensions.gender.reduceSum(function(d) {
    return d.worth;
});
_

返されたグループでallを呼び出すと、次のようになります(すべきです)。

_[
    { key: "m", value: 161000000000 },
    { key: "f", value: 35000000000 },
]
_

reduceCountはレコードをカウントします

_mycf.dimensions.gender.reduceCount();
_

返されたグループでallを呼び出すと、次のようになります(すべきです)。

_[
    { key: "m", value: 3 },
    { key: "f", value: 2 },
]
_

お役に立てれば :)

ソース: https://github.com/square/crossfilter/wiki/API-Reference

54
Isioma Nnodum

http://blog.rusty.io/2012/09/17/crossfilter-tutorial/

var livingThings = crossfilter([
  // Fact data.
  { name: “Rusty”,  type: “human”, legs: 2 },
  { name: “Alex”,   type: “human”, legs: 2 },
  { name: “Lassie”, type: “dog”,   legs: 4 },
  { name: “Spot”,   type: “dog”,   legs: 4 },
  { name: “Polly”,  type: “bird”,  legs: 2 },
  { name: “Fiona”,  type: “plant”, legs: 0 }
]);

例えば、私の家にはいくつの生き物がありますか?

これを行うには、すべてのレコードを単一のグループに選択するgroupAll簡易関数を呼び出し、次にレコードの数を作成するreduceCount関数を呼び出します。

// How many living things are in my house?
var n = livingThings.groupAll().reduceCount().value();
console.log("There are " + n + " living things in my house.") // 6

次に、家のすべての足の数を取得します。ここでも、groupAll関数を使用して1つのグループのすべてのレコードを取得しますが、次にreduceSum関数を呼び出します。これにより、値が合計されます。どんな値?まあ、私たちは足が欲しいので、ファクトから足の数を抽出して返す関数を渡しましょう。

// How many total legs are in my house?
var legs = livingThings.groupAll().reduceSum(function(fact) {
  return fact.legs;
}).value()
console.log("There are " + legs + " legs in my house.")

reduceCount関数は、レコードのカウントを作成します。
reduceSum関数は、これらのレコードの合計値です。

6
user1987371