2

データをグループ化するとき、ddply はプッシュまたはプルしますか? つまり、データ フレーム上で多くのパスが必要ですか、それとも 1 つだけですか?

4

1 に答える 1

5

コードを見ると、関数の一般的な構造がわかります。

function (.data, .variables, .fun = NULL, ..., .progress = "none", 
    .drop = TRUE, .parallel = FALSE) 
{
    .variables <- as.quoted(.variables)
    pieces <- splitter_d(.data, .variables, drop = .drop)
    ldply(.data = pieces, .fun = .fun, ..., .progress = .progress, 
        .parallel = .parallel)
}
<environment: namespace:plyr>

そのため、基本的に変数を使いやすい形式に再配置し、データを断片に分割してから、それらの断片に ldply を使用します。これらの断片は、関数 splitter_d によって生成されます。Pieces は、実際にはリストよりも少し洗練されています。これは、元のデータへのポインターであり、インデックスのリストです。リストの一部を要求すると、一致するインデックスが検索され、適切なデータが抽出されます。これにより、データのコピーが複数存在することを回避できます。またはを使用して、それがどのように機能するかを確認できgetAnywhere("splitter_d")ますplyr:::splitter_d

ldply は、すべてのデータを 1 回渡します。その後、すべてをデータフレームに結合します。実際、ldply のヘルプ ファイルには次のように書かれています。

すべての plyr 関数は、同じ分割-適用-結合戦略を使用します。入力をより単純な部分に分割し、各部分に .fun を適用してから、それらの部分を 1 つのデータ構造に結合します。この関数は、要素ごとにリストを分割し、結果をデータ フレームに結合します。結果がない場合、この関数は行と列がゼロのデータ フレームを返します (data.frame())。

私はそれを自分自身でうまく言うことができませんでした。そして奇跡的に、最初の文は ddply のヘルプ ページにもあります。

于 2010-11-16T09:45:55.747 に答える