R语言如何用嵌套循环批量实现抽样模拟及结果自动汇总
批量模拟实现方案
完全可以用嵌套逻辑(更推荐先封装单局函数再套外层循环,代码更干净好维护)一次性跑完所有重复,不用手动复制粘贴代码,具体实现如下:
核心逻辑
- 先把单局游戏的运行、汇总逻辑打包成可复用的自定义函数,同时修正原代码固定跑100次迭代的潜在bug:改用动态判断,集齐所有100个单元就自动终止单局循环,避免出现100次迭代未抽全单元导致结果错误的问题,同时减少无意义的算力消耗
- 初始化两个存储对象:用列表存储每一局的
summary_file,用向量存储每局集齐所有单元需要的迭代次数 - 外层循环控制重复游戏的总次数,每跑完一局就把结果存入对应位置,最后整理生成总汇总表即可
完整可运行代码
library(dplyr) # 第一步:生成总体数据集,和你原逻辑保持一致 var_1 = rnorm(100,10,10) var_2 = rnorm(100,1,10) var_3 = rnorm(100,5,10) response = rnorm(100,1,1) my_data = data.frame(var_1, var_2, var_3, response) my_data$id = 1:100 # 第二步:定义单局游戏运行函数 run_single_game <- function(pop_data, sample_per_iter = 10, total_unit = 100) { iter_results <- list() current_iter <- 1 observed_id <- c() # 动态循环:直到集齐所有单元才终止 while(length(unique(observed_id)) < total_unit) { # 当次抽样 iter_sample <- pop_data[sample(nrow(pop_data), sample_per_iter), ] # 存储当次抽样结果 iter_results[[current_iter]] <- data.frame( iteration_i = current_iter, iter_sample ) # 更新已观测到的单元ID集合 observed_id <- c(observed_id, iter_sample$id) current_iter <- current_iter + 1 } # 单局结果汇总,逻辑和你原代码完全一致 results_df <- do.call(rbind.data.frame, iter_results) test_1 <- results_df %>% group_by(id) %>% filter(iteration_i == min(iteration_i)) %>% ungroup() %>% distinct() summary_file <- test_1 %>% group_by(iteration_i) %>% summarise(Count = n(), .groups = "drop") %>% mutate( Cumulative = cumsum(Count), unobserved = total_unit - Cumulative ) return(summary_file) } # 第三步:批量运行多局游戏 n_games <- 1000 # 此处修改你需要重复运行的游戏总次数 all_summary_list <- list() # 存储所有局的summary_file iter_required <- c() # 存储每局集齐所有单元的迭代次数 for (game_id in 1:n_games) { # 运行单局 single_res <- run_single_game(pop_data = my_data) # 按要求命名存储单局结果,格式为summary_file_1、summary_file_2... all_summary_list[[paste0("summary_file_", game_id)]] <- single_res # 记录本局集齐所有单元需要的迭代次数 iter_required[game_id] <- max(single_res$iteration_i) } # 第四步:生成总汇总表 total_summary_file <- data.frame( game_id = paste0("game_", 1:n_games), iterations_required = iter_required )
结果调用方式
- 要获取某一局的
summary_file,直接从列表中索引即可,比如要获取第5局的结果,运行all_summary_list[["summary_file_5"]]就能拿到对应表格 - 总汇总表
total_summary_file运行完代码就直接生成,结构和你给出的示例完全一致
说明
相比手动复制代码的方式,这种写法改参数非常方便:比如要改每次抽样的单元数、总体规模、重复游戏次数,只需要修改对应参数值即可,不用逐段改重复代码。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

