如何在R中取一千个随机样本?

时间:2016-07-10 23:12:30

标签: r loops random

我看过How to create a loop for generate a list of random samples in 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)
}

我收到错误:

  

在测试中[i]&lt; - sample(x = c(0:9),size = 50128,replace = T):
  要替换的项目数量不是替换长度的倍数

至少50次(可能是5000次)。我试过改变样本的大小,样本的数量,但似乎没有什么可以摆脱这个错误。我正在尝试将所有样本存储在标题为Record的表中。

编辑:我知道如何使用apply / sapply / lapply制作循环,但我认为这些不是生成大量随机样本的好选择,因为我认为你不能将它们存放在任何地方。

2 个答案:

答案 0 :(得分: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)))

将创建一个5000x10的结果表(在我的机器上大约130秒)

最后,更多更有效的方法是

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

(0.007秒......)

答案 1 :(得分:5)

除非你真的需要它们,否则最简单的方法就是不要存储你生成的数字超过你需要的数字,因为它们将有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,如果存储的话)看起来都是一样的,尽管所需的时间可能会有所不同。