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

R语言for循环每次迭代如何保存rsb、rbs结果矩阵

实现方案

核心做法是在最外层循环启动前预先创建两个空列表,按迭代顺序存储每次循环生成的rsb和rbs结果,等全部循环跑完后一次性把列表内的矩阵按行拼接,就能得到符合要求的最终结果矩阵,这种写法也能避免循环内频繁绑定数据导致的运行效率下降问题。

修改后的代码框架

# 先将你提供的源数据赋值为代码中使用的变量名dx
dx <- structure(list(a = c(0.916290731874155, 2.89037175789616, 2.14658084451746, 
-2.62103882411258, -2.07944154167984, 2.00533356952611, -1.24319351747922, 
0.42744401482694, 1.29532258291416, -2.03292152604494, -0.606135803570316, 
-0.693147180559945), b = c(0.550046336919272, 0.228258651980981, 
-0.577634293438101, 0.135801541159061, 0.644357016390513, -2.30258509299405, 
-0.0870113769896297, 1.71297859137494, 0.17958557697508, -1.65140211153313, 
1.31218638896617, 2.19935904986485), c = c(0.0988458346366325, 
-3.34403896782221, 1.99243016469021, 0.737598943130779, 0.178691788743376, 
2.20727491318972, -1.40242374304977, -1.256836293883, -2.16905370036952, 
2.91777073208428, 0.138586163286146, -0.946143695023836), d = c(2.57963390914446, 
-5.14458326660599, 1.83258146374831, 1.15057202759882, 0.0613689463762919, 
-2.23359222150709, 4.34236137828145, -3.44854350225935, 1.29098418131557, 
-0.356674943938732, -0.21868920096483, -0.810930216216329), e = c(1.65140211153313, 
0.220400065368459, -0.044951387862266, 0.0773866636154201, -1.49877234454658, 
1.36219680954083, 2.07179039494432, -3.07731226054641, -0.916290731874155, 
1.65822807660353, 0.451985123743057, -0.810930216216329)), class = "data.frame", row.names = 2:13)

rs <- 4
sr <- 2
# 预创建空列表存储每次迭代的结果
rsb_list <- list()
rbs_list <- list()
# 初始化迭代计数索引
iter_idx <- 1

for (t in ((rs+1):(12-sr))) {
z <- 0
R <- Map(`+`, list((t-rs):(t-1)), (0:z))
cmin <- t(as.matrix(rep(NA, ncol(dx))))
cdf_mat <- matrix(NA, length(R), ncol(dx))
sq <- list()
for (r in seq(R)) {
  for (f in seq(ncol(dx))) {
    s_df<- rbind(0,dx[R[[r]],])
    df_cum <- sapply(s_df, function(x) ((cumsum(x)) + 1))
    x <- df_cum[,f]
    y <- df_cum[,-f]
    dif_2 <- (x - y)^2
    cmin[f] <- which.min(colSums(dif_2))
    dif_3 <- as.matrix(dif_2[,cmin[f]])
    cdf_mat[r,f] <- 
      if (f <= cmin[f]) {
        cmin[f] + 1
      } else { 
        cmin[f]
      }
    sq <- c(sq, list(sqrt(dif_3)))
    sqmat <- do.call(cbind, sq)
    sd <- (colSums(sqmat))/t
  }
}
# 保留你原有省略的中间业务逻辑即可
# .
# .
# .
# .
for (m in seq(M)) {
  sb_bs <- rbind(sell_o[m,], buy_c[m,],buy_o[m,],sell_c[m,])
}
rsb <- matrix(NA, length(M), ncol(dx))
rsb [] <- apply(sb_bs , 2 ,
 function(x) if((x[[1]] == 1) | (x[[2]] == 1)) 0 else x[[1]] - x[[2]])
rbs <- matrix(NA, length(M), ncol(dx))
rbs [] <- apply(sb_bs , 2 ,
 function(x) if((x[[3]] == 1) | (x[[4]] == 1)) 0 else x[[4]] - x[[3]])

# 将当前迭代结果存入对应列表
rsb_list[[iter_idx]] <- rsb
rbs_list[[iter_idx]] <- rbs
iter_idx <- iter_idx + 1
}

# 循环结束后一次性拼接所有结果,得到最终矩阵
rsb <- do.call(rbind, rsb_list)
rbs <- do.call(rbind, rbs_list)

说明

  • 你当前设置的参数下,外层t循环的取值范围是5:10,共6次迭代,拼接后得到的rsb和rbs刚好是6行5列的矩阵,和你给出的期望输出格式完全匹配。
  • 如果你后续调整参数导致每次迭代生成的rsb/rbs本身是多行矩阵,do.call(rbind,)也会自动按迭代顺序完成拼接,不需要额外修改代码。
  • 不要在循环内直接用rbind()逐次追加结果,这种写法会在每次追加时重新复制整个对象、重新分配内存,数据量大时运行速度会大幅降低,用列表暂存最后一次性拼接是R语言中最高效的循环结果存储写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:57:31