You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:12:30