1

plyrパッケージのDiamondsデータセットから価格/カラットの面で最良の取引を見つけようとしています

私もです

    new = ddply(diamonds, c("cut", "color", "clarity"), transform, ecart= price/carat -  mean(price/carat))   
    best = ddply(new, c("cut", "color", "clarity"), summarize, which(ecart == min(ecart))

しかし、私がそれをするとき、私は得ます

    head(best)
    cut color clarity ..1  
    1 Fair     D      I1   4  
    2 Fair     D     SI2  49  
    3 Fair     D     SI1  39  
    4 Fair     D     VS2   9  
    5 Fair     D     VS1   2

したがって、インデックスはddplyによって作成されたサブグループから取得されているようです。ここでは、最初のインデックス4のみがグローバルインデックスに対応しています。new [2、]を検索すると、たとえばFair、D、VS1のタイプではありません。

グローバルインデックスの位置を簡単に取得する方法について何かアイデアはありますか?

たとえば、id列をエレガントに追加するにはどうすればよいですか?より良い解決策はありますか?

4

2 に答える 2

4

、、およびecartの一意の組み合わせごとにの値が最も低いダイヤモンドを識別しようとしている場合は、次のようなことを行うつもりでした。cutcolorclarity

new <- ddply(diamonds, c("cut", "color", "clarity"), transform, 
         ecart= price/carat -  mean(price/carat))   
best <- ddply(new, c("cut", "color", "clarity"), 
         .fun = function(x){x[which.min(x$ecart),]})

diamondsこれは、に渡された各部分の外側のインデックスをいじる必要はありません.fun

編集

ハドリーはコメントで次のように指摘しています

ddply(new, c("cut","color","clarity"), subset, ecart == min(ecart))

よりエレガントです。また、最小のタイの場合、条件に適合するすべての行を正しく引き出します。

于 2011-07-09T19:59:19.343 に答える
2

私はあなたが何を望んでいたかをきちんと理解したと思います。この関数を直接使用しwhich.minて、ddplyによって返されるdata.framesにインデックスを付けることができます。これを行うには、匿名関数を使用する必要があります。

ddply(new, c("cut", "color", "clarity"), function(x) x[which.min(x$ecart) ,])

2番目の質問については、次のようなID列を生成できます。

diamonds$id <- seq_len(nrow(diamonds))

それが問題にどのように関係しているかはわかりませんが?

于 2011-07-09T20:05:14.083 に答える