2016-07-10 80 views
1

我讀過How to create a loop for generate a list of random samples in R?如何在R中抽取一千個隨機樣本?

我已經搜索了這個問題的答案,但我只是得到了通用循環問題。

我想用sample生成隨機5000個統一樣本,並將它們存儲在一個載體。我的想法,所以我來這裏尋求幫助,我的代碼:

Tests = NULL 

for(i in c(1:5000)) { 
    Tests[i]<- sample(x = c(0:9), size = 50128, replace = T) 
    Record<-table(Tests) 
} 

我得到的錯誤:

In Tests[i] <- sample(x = c(0:9), size = 50128, replace = T) :
number of items to replace is not a multiple of replacement length

至少50次(可能5000倍)。我試着改變樣本的大小,樣本的數量,但似乎沒有任何東西可以擺脫這個錯誤。我試圖將所有樣品存儲在標題爲Record的表格中。

編輯:我知道如何使用apply/sapply/lapply進行循環,但我不認爲這些會產生一噸的隨機樣本的不錯的選擇,因爲我不認爲你可以將它們存儲在任何地方。

回答

4

除非你真的很需要他們,這是最簡單的不存儲你生成的數字的任意時間比你需要的,因爲將他們的250640000,需要大約內存GB。相反,您可以立即致電table。使用replicate代替for環(你不使用i反正)將會把結果放到一個很好的矩陣對你太:

Record <- replicate(5000, table(sample(x = 0:9, size = 50128, replace = T))) 

Record[, 1:10] 
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
## 0 4999 4971 4919 5116 5101 5016 4861 5109 5063 4991 
## 1 5060 4959 4935 5047 5142 4927 5005 4920 5098 5023 
## 2 4916 4954 5019 4966 4994 4954 5049 5013 5031 5081 
## 3 4907 5007 5075 5042 4993 5015 5078 5037 4936 5073 
## 4 5117 4935 5003 5000 4970 5084 5008 4948 5115 5010 
## 5 4966 5146 5054 4944 5048 4935 5016 5104 5042 5010 
## 6 5055 4899 4964 5006 4977 5076 4943 5048 5064 4817 
## 7 5082 5040 5070 5034 4976 5056 5049 5012 4985 4983 
## 8 5094 5108 5014 4949 5052 5037 5073 5000 4894 5082 
## 9 4932 5109 5075 5024 4875 5028 5046 4937 4900 5058 

如果你真的需要存儲的號碼,以及,你可以使用類似的方法:

# Make a matrix of terms. Warning: big. 
Terms <- replicate(5000, sample(x = 0:9, size = 50128, replace = T)) 

# Apply table to each column (set of samples) 
Record <- apply(Terms, 2, table) 

另外,如果要存儲的樣本,而不是使用replicate你可以只直接採樣到矩陣:

Terms <- matrix(sample(x = 0:9, size = 50128 * 5000, replace = T), nrow = 50128) 
Record <- apply(Terms, 2, table) 

Record(和Terms,如果存儲的話)看起來是相同的,儘管所需的時間可能會有所不同。

10

你的問題不在於sample(),但存儲的對象,它是NULL的結果。這工作得很好(儘管進展緩慢,因爲我們存儲5000由50000對象):

Tests <- list() 
for(i in 1:5000) { 
    Tests[[i]] <- sample(x = c(0:9), size = 50128, replace = TRUE) 
} 

然而,table(Tests)試圖是要失敗的,因爲應用到列表table交叉分類列表,例如

table(1:5,1:5) 
##  1 2 3 4 5 
## 1 1 0 0 0 0 
## 2 0 1 0 0 0 
## 3 0 0 1 0 0 
## 4 0 0 0 1 0 
## 5 0 0 0 0 1 

但也許你真正想要的是

res <- replicate(5000, 
      table(sample(x = 0:9, size = 50128, replace = TRUE))) 

將(我的機器上在約130秒爲單位)創建結果的5000x10表

最後,更有效方式做到這一點將是

t(rmultinom(5000,size=50128,prob=rep(1,10))) 

(0.0 07秒...)