Aggregate-Rのデータフレームのための強力なツール

この投稿では、データに使用される集計関数の簡単なレビューを提供します。フレームといくつかの興味深い用途を提示します:些細ではあるが便利なものから、私がaggregateで解決した最も複雑な問題まで。

Aggregateは、名前が示すように、サブデータの各列にFUNパラメータで指定された関数を適用することにより、入力されたdata.framed.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などの列参照も機能しないこ

基本的な例

集約の最も基本的な使用法は、meansdなどの基本関数を含みます。 実際には、サンプルグループの平均値またはその他の特性を比較するためのaggregateの最も一般的な使用法の1つです。

最近、Excelシートから計算を再現しました。 ほとんどの数式は小計と総計でした。 Excelシートは、この目的のために非常に快適に整理されていませんでした:行、列、およびそれらの合計の合計の合計が使用されました。 Rでは、reshape2packageと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からaggregateby変数のリストは同じである必要はありません。 これは投稿の他の場所で暗示されていますが、これはそのような設定の明示的な例です。 第二に、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に固有のいくつかの追加のユースケースとともに、専用の投稿が来ています。

コメントを残す

メールアドレスが公開されることはありません。