2011-11-07 18 views
1

冗長計算を避けるためにddplyを使用します。非集計関数の最初の行

私はしばしば分割サブセット内で保存され、非集計分析を行う値を扱います。これを避けるには:

ddply(baseball,.(id,year),function(x){paste(x$id,x$year,sep="_")}) 

Error in list_to_dataframe(res, attr(.data, "split_labels")) : 
    Results do not have equal lengths 

私は各ミニデータフレームの最初の行を取る必要があります。

ddply(baseball,function(x){paste(x$id[1],x$year[1],sep="_")}) 

私は別のアプローチやヘルパーを使用する必要がありますか?この構文は厄介なようです。

-

注:私の例で貼り付けるだけのショーのためである - あまりにも文字通りそれを取ることはありません。このです実際の機能を想像してみて:

ddply(baseball,function(x){the_slowest_function_ever(x$id[1],x$year[1])}) 
+0

私は、 –

+0

問題の中から.variablesにアクセスする方法がないことに驚いています:https://github.com/hadley/plyr/issues/68 –

答えて

1

あなたが使用することができます

ddply(baseball, .(id, year), function(x){data.frame(paste(x$id,x$year,sep="_"))}) 

あなたが戻って一緒にdata.frameは、各エントリの列を作るとして、それを入れて、ベクトルを返すとき。しかし、長さが異なるので、すべてが同じ数の列を持つわけではありません。それをdata.frame()にラップすることにより、暗黙の(この場合は間違った)変換に頼るのではなく、関数がdata.frameを返すことを確認します。また、この構造内で簡単に新しい列の名前を付けることができます。

UPDATE:

あなただけ、あなただけの、それ自体で最初の行を引き出して、その上で動作することができ、(合理的である)一度機能を評価したいを考えます。

ddply(baseball, .(id, year), function(x) { 
    x <- x[1,] 
    paste(x$id, x$year, sep="_") 
}) 

これは、各id/yearコンボごとに1つの行のみを持ちます。元の数と同じ数の行を使用する場合は、これを以前のアイデアと組み合わせることができます。

ddply(baseball, .(id, year), function(x) { 
    firstrow <- x[1,] 
    data.frame(label=rep(paste(firstrow$id, firstrow$year, sep="_"), nrow(x))) 
}) 
3

あなたは、この場合にdata.table少し簡単かつ迅速に見つけるかもしれません。 .()変数の同等はby=です:

DT[, { paste(id,year,sep="_") }, by=list(id,year) ] 

または

DT[, { do.call("paste",.BY) }, by=list(id,year) ] 

私はあなたがjで任意の(複数行)匿名体(というよりも機能)を置くことができます説明するために{}を示してきましたこれらの簡単な例では、{}は必要ありません。

グループ化変数は、速度と利便性のために、各グループのスコープ内で長さ1(求めていると思われる)です。 .BYは、by基準がプログラム上でオンザフライで決定された場合の汎用アクセスのために、1つのリストオブジェクト内のグループ化変数も含む。つまり、事前にby変数がわからない場合です。