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
相关产品推荐
相关产品推荐

