我遇到了一个小问题,模拟掷骰子。基本上我这样做是为了熟悉循环及其输出。 意图是模拟两个骰子的投掷如下:
R = 100
d6 = c(1:6)
d = 60
DICE = NULL
for (i in 1:R)
{
i <- as.factor((sample(d6, size=d, replace = T)) + (sample(d6, size=d, replace = T)))
j <- summary(i)
DICE = rbind(DICE, j)
}
head(DICE)
HIS = colMeans(DICE)
boxplot(DICE)
title(main= "Result 2d6", ylab= "Throws", xlab="")
relHIS = (HIS / sum(HIS))*100
relHIS
如果一个导管中的结果为0(样本中未发生结果),则会出现问题。如果这在第一个子样本中随机发生,则缺少一个或多个类别(数字2-12)。这导致以下子样本中的问题(“结果列数不是向量长度的倍数(arg 2)”)。 我确定有一个非常简单的解决方案,通过事先定义一切......
感谢您的帮助!
答案 0 :(得分:1)
以下是一些修正:
R = 100
d6 = c(1:6)
d = 60
DICE = matrix(nrow = R, ncol = 11) #pre-allocate
colnames(DICE) <- 2:12
for (i in 1:R)
{
sim <- ordered((sample(d6, size=d, replace = T)) + (sample(d6, size=d, replace = T)),
levels = 2:12) #define the factor levels
sumsim <- table(sim)
DICE[i,] <- sumsim #sub-assign
}
head(DICE)
HIS = colMeans(DICE)
boxplot(DICE)
title(main= "Result 2d6", ylab= "Throws", xlab="")
prop.table(HIS) * 100
始终预先分配结果数据结构。在循环中增长它非常慢,你知道它需要多大。另外,不要对迭代变量和其他东西使用相同的符号。
答案 1 :(得分:0)
在第七行中省略as.factor()