No.21631 ループでの全生成データ集積方法  【赤岳】 2015/04/26(Sun) 22:19

お世話になります。Rの基本操作のことでご教示お願いします。
ループで生成したデータをデータフレームで集積する方法がわかりません。
1回目のループで3個,2回目3個,・・5回目3個と,3個のデータをrnormで生成し,各列に
以下のように表示させたいのですが,下記の自作プログラムでは,エラーが出てしまいます。何が悪いのか,どなたかご指摘いただけませんでしょうか。(q〜zのラベルは便宜上付けているだけで,どうでもいいです) appendの使い方もよく理解していません。
q r x y z
1 2 1 3 1 2
2 4 5 4 3 2
3 5 2 2 4 1

自作では,
> X<-NULL
> Random<-NULL
> for(i in 1:5){
+ Random<- rnorm(3, mean= 2, sd=1)
+ X[, i]<- append(X, Random) # Xのi列にi番目に生成したデータを格納したい
+ }
以下にエラー X[, i] <- append(X, Random) :
行列への添え字の数が正しくありません。

No.21632 Re: ループでの全生成データ集積方法  【青木繁伸】 2015/04/27(Mon) 06:00

ループの中は,
X <- cbind(X, Random) # Xのi列にi番目に生成したデータを格納したい
とすればよいでしょう。
このようにして作られるのは行列なので,ループのあとに
X <- data.frame(X)
とすればデータフレームになります。
なお,cbind を使うのは,大規模なデータを作るにのには不適切なので,前もって大きさが分かっている場合には事前に matrix でメモリを確保しておく方がよいでしょう(Random は確保しなくてもよい)。すなわち,
X <- matrix(0, 3, 5)
for (i in 1:5) {
Random <- rnorm(3, mean=2, sd=1)
X[, i] <- Random
}
X <- data.frame(X)
となり,Random を使う必要はないので
X <- matrix(0, 3, 5)
for (i in 1:5) {
X[, i] <- rnorm(3, mean=2, sd=1)
}
X <- data.frame(X)
となり,どの列も同じ平均値と標準偏差を持つ乱数でよいのなら,
X <- matrix(rnorm(15, mean=2, sd=1), 3, 5)
X <- data.frame(X)
になり,行列を保存してからデータフレームにする必要もないので,
X <- data.frame(matrix(rnorm(15, mean=2, sd=1), 3, 5))
でよいことになります。

No.21633 Re: ループでの全生成データ集積方法  【赤岳】 2015/04/27(Mon) 09:19

青木先生,できました!
cbindとかmatrixを使うんですね。
自作ではなかなかこういう発想が出てきません。
ありがとうございました。

● 「統計学関連なんでもあり」の過去ログ--- 047 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る