2012-03-22 92 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 
} 

但它沒有工作!對於每個dep [i]我只有一個數字,而不是九個列表。

我該怎麼做?如果我想將每個dep [i]包含在數據框中?

非常感謝,我希望你明白我想要什麼。

回答

6

這是因爲你已經制作了一個向量(默認情況下爲1D)dep,但是你試圖在其中存儲二維對象。

可以作爲NULLrbind(行綁定)將其在loop.Also dep關,注意,而不是在循環使用count你可以用i

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) 

完成!

所以,你可以把你所有上面的代碼在一行:

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

如果你願意,你可以調用data.framedep(後它被置入其二維矩陣形式)得到的數據幀。

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 2012-03-23 10:00:11