データをグループ化するとき、ddply はプッシュまたはプルしますか? つまり、データ フレーム上で多くのパスが必要ですか、それとも 1 つだけですか?
1 に答える
コードを見ると、関数の一般的な構造がわかります。
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 のヘルプ ページにもあります。