2012-03-22 3 views
3

私はこのように、ランダムなサンプルが含まれている一連のオブジェクトを作成するループを作成しようとしている:Rでランダムサンプルのリストを生成するためのループを作成するには?

sample <- ceiling(runif(9, min=0, max=20)) 

(これは、丸みを帯びた均一のための一例であるが、それは正常なことで置き換えることができます、ポアソン、またはあなたが何を望むものであれ)。

私は、これらのジェネレータを自動的に生成するためのループを構築しました。これらのジェネレータはデータフレームに組み込むことを目的としていました。その後、私が設計したループは、このでした:

N=50 
dep=as.vector(N) 
count=1 
for (i in 1:N){ 
    dep[count] <- ceiling(runif(9, min=0, max=20)) 
    count=count+1 
} 

しかし、それは動作しませんでした!それぞれのデポ[i]については、私は数字だけを持っています.9のリストではありません。

どうすればいいですか?データフレームにすべてのdep [i]を含める場合は、

ありがとう、私はあなたが私が望むことを理解していただければ幸いです。

答えて

6

これはdepをベクター(デフォルトでは1D)にしたものですが、その中に2次元オブジェクトを保存しようとしています。

あなたが代わりにあなたのループ内でcountを使用してのあなただけのiを使用できることに注意し、loop.AlsoでそれにNULLrbindとして(行バインド)オフdepことができます。

dep <- NULL 
for (i in 1:N){ 
    dep <- rbind(dep, ceiling(runif(9, min=0, max=20))) 
} 
# if you look at dep now it's a 2D matrix. 
# We'll convert to data frame 
dep <- as.data.frame(dep) 

しかしこれを行う簡単な方法があります。あなたはdep行ごとを生成する必要はありません、あなたは丸め一様分布番号の9*Nを含むベクトルを作ることによって、フロントにそれを生成することができます。

dep <- ceiling(runif(9*N,min=0,max=20)) 

を、depは、現在の長さのベクトルであります9 * N。それをNx9マトリックスにしましょう:

dep <- matrix(dep,nrow=N) 

完了!

ですから、1行に上記のすべてのコードを実行できます。

dep <- matrix(ceiling(runif(9*N,min=0,max=20)), nrow=N) 

したい場合(これは、その2次元マトリクス状に置かれていた後)は、データフレームを取得するためにdepdata.frameを呼び出すことができます。

6

as @ mathematical.coffeeが説明されています。しかし、あなたの場合はrunifのように見えますが、代わりにsampleを使用することができます。そして実際にはsample.intがより信頼できます。 ...ここではrunifを使用するより3倍速く):

N <- 1000000 
system.time(dep <- matrix(sample.int(20, 9*N, replace=TRUE), N)) # 0.16 secs 
range(dep) # 1 20 

system.time(dep <- matrix(ceiling(runif(9*N, min=0, max=20)), N)) # 0.45 secs 
range(dep) # 1 20 
+0

うん!このシンプルなトリックははるかに速く動作します。ありがとう、あまりにもありがとう! – anxoestevez

関連する問題