【发布时间】:2021-12-31 17:55:51
【问题描述】:
我正在使用 R 编程语言。我想到了以下我想测试的问题:
- 假设有一枚硬币有 5% 的机会正面朝上,95% 的机会朝反面着陆
基于计算机模拟,我想找出以下内容:
-
观察HEADS、TAILS、HEADS前的最少翻转次数
-
观察HEADS、TAILS、HEADS前的平均翻转次数
-
观察HEADS、TAILS、HEADS前的最大翻转次数
我尝试在 R 中编写一个模拟,将这枚硬币翻转 3 次,我称之为“运行”。然后模拟执行 100 次“运行”:
results <- list()
for (i in 1:100){
response_i <- c("H","T")
response_i <- sample(response_i, 3, replace=TRUE,
prob=c(0.05, 0.95))
response_i <- as.factor(response_i)
iteration_i = i
run_i = data.frame(response_i, iteration_i)
results[[i]] <- run_i
}
这看起来如下(例如运行#22、#23、#24):
[[22]]
response_i iteration_i
1 T 22
2 T 22
3 T 22
[[23]]
response_i iteration_i
1 H 23
2 T 23
3 T 23
[[24]]
response_i iteration_i
1 T 24
2 T 24
3 T 24
我的问题:
我想修改上面的代码,这样:
1) 看到第一个 H、T、H 后模拟自动停止(现在,我运行了 100 次模拟,希望这足以观察至少一个 H , T, T)
2) 一旦第一个 H、T、H 出现并且模拟自动停止,我想记录发生在哪个“运行”(即“iteration_i”的值是多少?)
3)然后我想将整个模拟重复 100 次(100 次运行 * 100 次 = 10,000 次抛硬币)
一旦完成,我将能够制作直方图,显示在观察到 H、T、H 之前的最少掷硬币次数、平均掷硬币次数和最大掷硬币次数(使用“ggplot2” ,我认为这不会太难)。
#sample data
number_of_runs_before_HTH_appeared = c(15,10, 11, 8, 12, 21, 32, 7, 9, 20, 22, 3, 16, 7 )
hist(number_of_runs_before_HTH_appeared, main = "Number of Runs before HTH")
但是有人可以帮我格式化/修改我的代码以简化我想要实现的目标吗?目前,我使用以下 R 代码“整理”了第一次模拟的 100 次“运行”:
results_df <- do.call(rbind.data.frame, results)
head(results_df)
response_i iteration_i
1 T 1
2 T 1
3 T 1
4 T 2
5 T 2
6 T 2
然后我手动重复了很多次,例如..g
results_df_1 <- do.call(rbind.data.frame, results)
results_df_1$index = 1
#re-run original simulation
results_df_2<- do.call(rbind.data.frame, results)
results_df_2$index = 2
#re-run original simulation (many times)
results_df_n<- do.call(rbind.data.frame, results)
results_df_n$index = n
final <- data.frame(results_df_1, results_df_2, results_df_n)
然后我将此“最终”文件导入 Microsoft Excel 并尝试手动折叠“最终文件”以回答我的三个原始问题 - 但我希望有人可以通过修改我的原始代码来告诉我如何做到这一点R.
有人可以帮我解决这个问题吗?
谢谢!
【问题讨论】:
标签: r loops for-loop data-manipulation