R语言如何保存for循环每次迭代的cmin计算结果到矩阵
R实现循环保存每次迭代最小值列索引的方法
原脚本问题
原有代码的问题是循环过程中每次都会覆盖output和cmin变量,没有预留存储容器存放每一轮迭代的计算结果,循环结束后只能拿到最后一次迭代的cmin值,无法得到全部12轮的结果。
修正后代码
提前预分配12行1列的结果矩阵,每轮循环计算得到cmin后,直接存入矩阵对应行的位置即可:
# 加载目标数据框dx dx <- structure(list(a = c(0.916290731874155, 2.89037175789616, -0.156004248476581, -0.318453731118534, -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, 0.282862786015832), c = c(0.0988458346366325, -3.34403896782221, 1.99243016469021, -1.70474809223843, 2.62103882411258, 2.20727491318972, -1.40242374304977, -1.256836293883, -2.16905370036952, 2.91777073208428, 0.138586163286146, -0.946143695023836), d = c(0.268263986594679, -2.83321334405622, 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, -0.295845383090942, -0.709676482511156, -0.916290731874155, 1.65822807660353, 0.451985123743057, -0.810930216216329)), class = "data.frame", row.names = 2:13) # 预分配12行1列的结果矩阵,初始填充NA cmin_res <- matrix(NA, nrow = 12, ncol = 1) for(i in 1:12) { output <- 2*dx[i,] # 将当前轮次计算得到的最小值列索引存入结果矩阵对应位置 cmin_res[i, 1] <- which.min(output) } # 打印结果 print(cmin_res)
运行后即可得到你预期格式的输出结果。
更简便的无循环写法
R中优先推荐向量化操作,不需要写循环就能一次性得到结果,运行效率更高:
# 对dx所有值乘2后,按行计算最小值的列索引,最后转为1列矩阵 cmin_res <- matrix(apply(2 * dx, 1, which.min), ncol = 1)
内容的提问来源于stack exchange,提问作者bcsfh
相关产品推荐
相关产品推荐

