1

thetas約 270 万の観測値を含むというデータ フレームがあります。

> str(thetas)
'data.frame':   2700000 obs. of  8 variables:
 $ rho_cnd   : num  0 0 0 0 0 0 0 0 0 0 ...
 $ pct_cnd   : num  0 0 0 0 0 0 0 0 0 0 ...
 $ sx        : num  1 2 3 4 5 6 7 8 9 10 ...
 $ model     : Factor w/ 7 levels "dN.mN","dN.mL",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ estTheta  : num  -1.58 -1.716 0.504 -2.296 0.98 ...
 $ trueTheta : num  0.0962 -3.3913 3.6006 -0.1971 2.1906 ...
 $ estError  : num  -1.68 1.68 -3.1 -2.1 -1.21 ...
 $ trueAberSx: num  0 0 0 0 0 0 0 0 0 0 ...

ddply、または同様の関数を使用して、推定誤差(estErrorデータフレームの列)を合計したいと思いますが、合計はシミュレーションの各条件内にあります。問題は、このデータ フレームの他の列の値を組み合わせて、これらすべての条件を一意に識別する簡単な方法がないことです。具体的には、列modelには 7 つの可能な値が含まれています。rho_cndこれらの可能な値のうちの 3 つは、とのそれぞれで 1 つの可能な値とだけ一致しますがpct_cnd、 の他の 4 つの可能な値は、modelと の 6 つの可能な値のペアと一致しrho_cndますpct_cnd

私が知っている明らかな解決策は、戻って、ここで特定する必要があるすべての条件を一意に識別する変数を作成することです。これにより、次のコードが機能します。

> sums <- ddply(thetas,.(condition1,condition2,etc.),sum(estError))

しかし、私はこのデータ フレームがどのように構築されているかを再現したくありません。現在、2 つの別々の呼び出しで作成された 2 つのデータ フレームexpand.gridがあり、それをrbind編集して並べ替えて、すべての有効な条件をリストするデータ フレームを作成していますが、これらの数行のコードを保持していても、それらを参照する方法がわかりませんddply. 私はむしろこのソリューションを使用したくありませんが、必要に応じて使用します。

> conditions 
   models rhos pcts
1   dN.mN  0.0 0.00
2   dN.mL  0.0 0.00
3   dN.mH  0.0 0.00
4   dL.mN  0.1 0.01
12  dL.mN  0.1 0.02
20  dL.mN  0.1 0.10
8   dL.mN  0.2 0.01
16  dL.mN  0.2 0.02
24  dL.mN  0.2 0.10
5   dL.mL  0.1 0.01
13  dL.mL  0.1 0.02
21  dL.mL  0.1 0.10
9   dL.mL  0.2 0.01
17  dL.mL  0.2 0.02
25  dL.mL  0.2 0.10
6   dH.mN  0.1 0.01
14  dH.mN  0.1 0.02
22  dH.mN  0.1 0.10
10  dH.mN  0.2 0.01
18  dH.mN  0.2 0.02
26  dH.mN  0.2 0.10
7   dH.mH  0.1 0.01
15  dH.mH  0.1 0.02
23  dH.mH  0.1 0.10
11  dH.mH  0.2 0.01
19  dH.mH  0.2 0.02
27  dH.mH  0.2 0.10

より良いコードおよび/またはより効率的なアドバイスはありますか? ありがとう!

4

1 に答える 1

2

ddply(thetas,.(model,rho_cnd,pct_cnd),...)うまくいくはずのコメントに同意します。これらの変数の特定の組み合わせが表示されない場合、ddply(..., .drop=TRUE) は、観測されていない組み合わせが表示されないようにします。

ただし、存在しない組み合わせのいくつかを ddply が調べないようにしたい場合は、次のようなことを試すことができます。

#newCond <- apply(thetas[,c("model", "rho_cnd", "pct_cnd")], 1, paste, collapse="_")
newCond <- do.call(paste, thetas[,c("model", "rho_cnd", "pct_cnd")], sep="_") #as suggested by baptiste
thetas2 <- cbind(thetas, newCond)

確かに、上記のコードは実行速度が遅いかもしれないので、それがあなたの望むものかどうかはわかりません。しかし、そこから .variables=newCond で ddply() を使用できるはずです。

さらに、データのサブセットごとに単一の数値のみを返すため、必要に応じて集計を使用できます。

sums <- aggregate(thetas2[,"estError"], by=thetas2[,"newCond"], colSums)

これが役立つことを願っています。

于 2013-05-04T00:27:39.370 に答える