2017-02-15 8 views
0

でこれをより簡潔にすることを検討しています。確率に基づいて返されるバイナリデータ値(0,1)を持つ1つの行列 "マット"が必要です。現在、私は個別に各列を作成しているとcbindを使用するため、最終的な行列を作成します:確率は、kは列インデックスのデフォルトの数ですが、私は確認していない機能1/kで測定することができるしかし列のインデックス値を参照する式

mat1=matrix(rbinom(100,1,1), 100, 1) 
mat2=matrix(rbinom(100,1,1/2), 100, 1) 
mat3=matrix(rbinom(100,1,1/3), 100, 1) 
mat4=matrix(rbinom(100,1,1/4), 100, 1) 
mat5=matrix(rbinom(100,1,1/5), 100, 1) 
mat6=matrix(rbinom(100,1,1/6), 100, 1) 
mat7=matrix(rbinom(100,1,1/7), 100, 1) 
mat8=matrix(rbinom(100,1,1/8), 100, 1) 
mat9=matrix(rbinom(100,1,1/9), 100, 1) 
mat10=matrix(rbinom(100,1,1/10), 100, 1) 

を列インデックスを参照する方法。これをどのように単純化することが可能ですか?このすべての反復(すなわち、k = k + 1 ...)を説明する関数を使用することは可能ですか?

+1

'sapply(1:10、function(x)rbinom(100,1,1/x))'? – nrussell

+0

これは素晴らしい!私は週に1度だけRを使いました。そして、私はこのことを恥ずかしく思いつくために4時間のように過ごしました。おかげで – Aesler

答えて

0

は、あなたが「迅速かつ汚い」 - 溶液として、forループを使用することができます。ここでは

# setting seed for comparison later on 
# set.seed(1111) 

# preparing an empty vector 
out<-c() 

# for-loop 
for (k in 1:10){ 
    out<-c(out, rbinom(100,1,1/k)) 
} 
out<-matrix(out, 100, 10) 

は、kは最初の反復では一つであり、それは2番目と中2です。すべてが呼び出される1つのベクトルに格納されます。 matrix-functionはデフォルトで列ごとに行列を埋めます。したがって、outは100 * 10の行列であり、各列はkの1つの値に属します。

set.seed(1111) 
mat1=matrix(rbinom(100,1,1), 100, 1) 
mat2=matrix(rbinom(100,1,1/2), 100, 1) 
mat3=matrix(rbinom(100,1,1/3), 100, 1) 
mat4=matrix(rbinom(100,1,1/4), 100, 1) 
mat5=matrix(rbinom(100,1,1/5), 100, 1) 
mat6=matrix(rbinom(100,1,1/6), 100, 1) 
mat7=matrix(rbinom(100,1,1/7), 100, 1) 
mat8=matrix(rbinom(100,1,1/8), 100, 1) 
mat9=matrix(rbinom(100,1,1/9), 100, 1) 
mat10=matrix(rbinom(100,1,1/10), 100, 1) 
mat<-cbind(mat1,mat2, mat3,mat4,mat5,mat6,mat7,mat8,mat9,mat10) 

identical(mat, out) 

同じ機能は、forループは同じことをすることを証言すべきである:それはあなたのアプローチとまったく同じマトリックスになりことを証明するために

。しかし、R-Programmersと同じくらい多くの方法があります。

Rパッケージ "swirl"が便利でしょう。このようなタスクの実行方法を対話的に教えてくれます!

編集:はい、私は遅すぎました。 NRussellはすでにコメント(短いコード、より良いパフォーマンスの点で)の答えを与えた;

+0

ありがとう! – Aesler

関連する問題