我看过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
制作循环,但我认为这些不是生成大量随机样本的好选择,因为我认为你不能将它们存放在任何地方。
答案 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
,如果存储的话)看起来都是一样的,尽管所需的时间可能会有所不同。