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

