我已经阅读了如何创建一个循环来生成R中的随机样本列表?
我已经在互联网上搜索了这个问题的答案,但我只是得到了泛型循环问题.
我想使用生成5000个随机均匀样本sample并将它们存储在向量中.我没有想法,所以我来这里寻求帮助,我的代码:
Tests = NULL
for(i in c(1:5000)) {
Tests[i]<- sample(x = c(0:9), size = 50128, replace = T)
Record<-table(Tests)
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
在Tests [i] < - sample(x = c(0:9),size = 50128,replace = T):
要替换的项目数不是替换长度的倍数
至少50次(可能是5000次).我试过改变样本的大小,样本的数量,但似乎没有什么可以摆脱这个错误.我正在尝试将所有样本存储在标题为的表中Record.
编辑:我知道如何使用apply/ sapply/ 进行循环lapply,但我不认为这些是生成大量随机样本的好选项,因为我认为你不能将它们存储在任何地方.
Ben*_*ker 11
你的问题不在于sample(),而是将结果存储在一个对象中NULL.这工作正常(虽然因为我们存储5000乘50000对象而缓慢):
Tests <- list()
for(i in 1:5000) {
Tests[[i]] <- sample(x = c(0:9), size = 50128, replace = TRUE)
}
Run Code Online (Sandbox Code Playgroud)
但是,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
Run Code Online (Sandbox Code Playgroud)
但也许你真正想要的是
res <- replicate(5000,
table(sample(x = 0:9, size = 50128, replace = TRUE)))
Run Code Online (Sandbox Code Playgroud)
这将创建一个5000x10的结果表(在我的机器上大约130秒)
最后,很多更有效的方式做到这将是
t(rmultinom(5000,size=50128,prob=rep(1,10)))
Run Code Online (Sandbox Code Playgroud)
(0.007秒......)
除非你真的需要它们,否则最简单的方法就是不要存储你生成的数字超过你需要的数量,因为它们将有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
Run Code Online (Sandbox Code Playgroud)
如果您确实需要存储数字,可以使用类似的方法:
# 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)
Run Code Online (Sandbox Code Playgroud)
或者,如果您要存储样本,而不是使用replicate您可以直接采样到矩阵:
Terms <- matrix(sample(x = 0:9, size = 50128 * 5000, replace = T), nrow = 50128)
Record <- apply(Terms, 2, table)
Run Code Online (Sandbox Code Playgroud)
Record(并且Terms,如果存储的话)看起来都是一样的,尽管所需的时间可能会有所不同.