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

R语言使用for循环保存模拟结果仅保留最后一次复现数据问题

错误原因及修正方案

核心错误点

  • 循环内对sim.res的整列直接赋值,每次运行都会覆盖整列的所有历史值。你传入的mn1是单个标量,R会自动将标量广播到整列的所有元素,因此循环结束后仅保留最后一次迭代的结果。
  • 初始数据框初始化逻辑错误。你创建sim.res时引用的mn1、mn2、rep在未提前定义的前提下会直接触发“对象未找到”报错;即使提前定义了变量,初始数据框也只有1行,没有预留足够的存储空间容纳10次迭代的结果。

推荐修正方案

优先选择预分配内存的实现方式,模拟迭代次数较多时效率远高于逐行追加:

# 预分配10行空数据框,提前定义各列数据类型
sim.res <- data.frame(mn1 = numeric(10), mn2 = numeric(10), rep = integer(10))

for (k in 1:10){
  set.seed(k*8)
  mn1 <- mean(rnorm(25, 1, 1))
  mn2 <- mean(rnorm(25, 2, 1))
  # 仅给第k行对应位置赋值,不覆盖其他行数据
  sim.res[k, ] <- c(mn1, mn2, k)
}

如果无法提前确定迭代次数,可以使用列表暂存结果最后合并,避免逐行rbind的性能损耗:

# 初始化空列表存结果
res_list <- vector("list", length = 10)
for (k in 1:10){
  set.seed(k*8)
  mn1 <- mean(rnorm(25, 1, 1))
  mn2 <- mean(rnorm(25, 2, 1))
  res_list[[k]] <- data.frame(mn1 = mn1, mn2 = mn2, rep = k)
}
# 合并列表为数据框
sim.res <- do.call(rbind, res_list)

内容的提问来源于stack exchange,提问作者Leslie Rutkowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:54:04