この投稿では、データに使用される集計関数の簡単なレビューを提供します。フレームといくつかの興味深い用途を提示します:些細ではあるが便利なものから、私がaggregateで解決した最も複雑な問題まで。
Aggregate
は、名前が示すように、サブデータの各列にFUN
パラメータで指定された関数を適用することにより、入力されたdata.frame
d.fを集計できるベースRの関数です。by
入力パラメータで定義されたフレーム。
by
パラメータはlist
でなければなりません。 ただし、data.frame
は列の(名前付き)リストとして処理されるため、data.frame
の1つ以上の列をby
パラメーターとして渡すこともできます。 興味深いことに、これらの列がx
として入力された列と同じdata.frame
の場合、それらの列はFUN
関数に渡されません。適用する関数は、avector
を受け入れることができる必要があります(adata.frame
の列の一部を入力として呼び出されるため)。
サブデータ。by
入力パラメータで定義されたフレームは、論理インデックスと考えることができます:
d.f <- data.frame(rating = c("AAA", "A", "A", "AAA", "BB", "BB", "AAA", "A"))i <- 1by <- d.f$ratingsub.data.frame <- d.f, ]
そして、1からlength(unique(by))
の間のすべてのi
に対してこれを行います。 2460>変数はdata.frame
の1つ(または複数)の列と一致する必要はありませんが、何でもかまいません。 したがって、by
として渡された変数の一意の値に対してcycle変数を実行するfor
サイクルと、FUN
として渡された関数をdata.frame
サブの各列に適用するsapply
によって、aggregate
機能を再現することができます。データ。フレーム。 しかし、このような回避策は、このコードが実際に何をしているのか(そしてなぜ)不明であるため、文書化することは非常に困難です。
Aggregate
は常に結果としてdata.frame
を返します。 このdata.frame
には、入力パラメータby
からの(現在は一意の)値が最初の列として含まれ、入力されたdata.frame
の列の部分に適用されるFUN
パラメータの関数への呼び出しの結果を含む列が含まれます。 興味深いことに、関数FUN
が複数の値を返す場合、結果data.frame
の列のクラスはlist
またはlist
何かにキャストできることに注意してください(下の最後の例を参照)。
関数呼び出しはdata.frame
の名前付き列ではなく名前のないベクトルに適用されるため、data.frame
の名前を参照することは機能せず、s.d.f
などの列参照も機能しないこ
基本的な例
集約の最も基本的な使用法は、mean
やsd
などの基本関数を含みます。 実際には、サンプルグループの平均値またはその他の特性を比較するためのaggregate
の最も一般的な使用法の1つです。
最近、Excelシートから計算を再現しました。 ほとんどの数式は小計と総計でした。 Excelシートは、この目的のために非常に快適に整理されていませんでした:行、列、およびそれらの合計の合計の合計が使用されました。 Rでは、reshape2
packageとmelt
を使用してデータをスタースキーマ表現(すべてのメタデータが行単位で表され、すべての値が独自の行を取得する場合)に変更し、異なる変数に沿ってaggregate
を使用して異なる合計を取得しました。 ディメンションに沿った総計は単にそのディメンションを”by”として使用しますが、小計はby
として複数の変数を使用して達成できます。 この場合のFUN
はもちろんsum
でした。
aggregateとbase関数の便利な使い方の1つは、さまざまな値の出現数を取得することです。
ベース関数でのaggregateの私のお気に入りの使用は、一連の日付の各月 これを行うには、次のコードを使用できます(日付が”YYYY-MM-DD”形式で文字列または次のように格納されていると仮定しますDate
):
月の最後の日は、銀行の休日だけでなく、週末に依存していた銀行情報を扱うときにこれは非常に便利になりました。
高度な使用
aggregate
のより高度な使用は、独自のfunction
を記述することに依存します。FUN
パラメータとして渡される無名関数。 これを行うには、構文
# do not run the syntaxaggregate(x = d.f, by = by.list, FUN = function(s.d.f){y <- s.d.f; return(y)}
を使用することができます可能な用途は、分布をサンプルのカテゴリに当てはめることによって、ポートフォリオの均質なリスクグループの複雑なポートフォリオリスクメトリクスを呼び出すことから、実際にイメージできるものまで多岐にわたります。
以下は、”複雑な”ポートフォリオリスクメトリック(異なる資産クラスの異なる取引相手へのエクスポージャー)の例です。:
ここではaggregate()
関数の使用方法を示します。
次へ:ガウス分布をカテゴリ別の観測値に当てはめる:
以下では、aggregate()
関数を使用してカテゴリ別の平均と標準偏差を求めます。
この最後の例では、いくつかの興味深い特性を紹介しています。 まず、data.frame
からaggregate
とby
変数のリストは同じである必要はありません。 これは投稿の他の場所で暗示されていますが、これはそのような設定の明示的な例です。 第二に、FUN
として渡される関数は無名関数であるだけでなく、複数の入力パラメータを持つ関数からカリー化されます。 単一の入力変数observations
の関数は、2つの入力変数関数fitdistr
から作成されました。densfun = "normal"
を設定して入力変数の1つを固定します。 第三に、fitdistr
関数の完全な戻り値を返すのではなく、戻り値は戻り値から要素estimate
に制限されます。 最後になりましたが、FUN
に渡された無名関数の戻り値は、1つだけでなく2つの変数で構成されています。 興味深いことに、aggregateは戻り値をlist
からmatrix
にキャストし、要素に名前を付けます。 ただし、これらの名前を行列の列を参照するために使用することはできません。 ただし、次のように参照できます:
distr.estimate$observation] 3.016988
終わりの言葉
あなたが上記の有用性を発見したことを願っています。 あなたがaggregate
にもっと精通しているので、それは真実の時です:上記のすべてとはるかに多くはdata.table
で、はるかに高速なパフォーマンスで行うことができます。 しかし、data.table
は複雑な構文を持っており、aggregate
はシンプルで洞察力がありますが、実際には物事が内部でどのように機能するかを理解する必要があります。 集約のロジックとdata.table
の構文の両方に慣れるまでは、最初にaggregate
を使用してコードを記述し、data.table
を使用して書き直して最適化することは価値のある投資です。
興味のある人のために、上記がdata.table
でやり直され、data.table
に固有のいくつかの追加のユースケースとともに、専用の投稿が来ています。