2

ddply の次のコード:

ddply(df, .(groupA), summarise, x=sum(x)/sum(a), y=sum(x)/sum(b))

上記の関数を実行してyによって値を計算すると、取得しよsum(x)/sum(b)うとしているものが取得されず、代わりに が取得sum(sum(x)/sum(a))/sum(b)xれます。x=sum(x)/sum(a)x

では、新しく計算されたx値を使用せずに、元の df を使用する方法はx? この機能は以前は実装されておらず、2011 年または 2012 年のいずれかの時点で追加されたことを覚えています。記憶が正しければ解決方法はあると思いますが…

ありがとう。

[アップデート]

たとえば、SimonO101 の場合、次の 2 つのコードは異なる結果を返します。

ddply(mtcars,.(cyl),summarise,x=mean(hp/wt))
ddply(mtcars,.(cyl),summarise,hp=mean(hp),wt=mean(wt),x=mean(hp/wt))

2 番目の関数は、元の df のandではなく、計算されたばかりのhpandからとの値を取得するためです。したがって、これらの列に元の列と同じ名前を付けることを避けずに、名前の競合を回避する方法を知りたいです。wtmean(hp)mean(wt)hpwt

4

1 に答える 1

1

あなたの例で問題なく機能する簡単な解決策の 1 つ (ただし、常にそうとは限りません) は、ステートメントの順序を切り替えることです。

library(plyr)
d1 <- ddply(mtcars,.(cyl),summarise,
        x=mean(hp/wt),  ## do this first!
        hp=mean(hp),
        wt=mean(wt))
## check
d1[d1$cyl=="4","x"] == with(subset(mtcars,cyl==4),mean(hp/wt))

私は通常、上記のコメントのような小さなメモを残して、将来のある時点で順序を忘れて切り替えないようにします (そして、自分自身を完全に混乱させます)。

http://r4stats.com/2013/01/22/comparing-transformation-styles/は有益な議論です。

于 2013-11-08T02:01:00.430 に答える