如何在R语言中将嵌套循环计算值存入矩阵及代码问题排查
解决R嵌套循环计算与结果存储的问题
咱们逐个拆解你遇到的两个问题,再给出修正后的代码:
问题i:无法存储所有计算值的原因
你原来的循环里,每次执行results <- (1+i - (1+(i^j))^(1/j))时,都是直接把整个results变量替换成当前循环的单个计算值,而不是把值填充到预先创建的矩阵里。循环结束后,自然只剩下最后一次循环的结果,之前的所有计算都被覆盖了。
问题ii:用results[i,j]赋值出现大量NA的原因
你用i(PE里的数值,比如1、1.1、1.2...)和j(w里的数值,比如1、1.1...)作为矩阵的行/列索引,但矩阵的索引必须是整数位置(比如第1行、第2行),而不是变量的实际数值。当你用非整数的数值作为索引时,R会尝试扩展矩阵并填充NA,最终就会出现大量缺失值,还会偏离你预期的11行31列结构。
修正后的代码
我们需要用循环索引来定位矩阵的位置,而不是直接用PE和w的数值:
# 创建变量 w <- seq(1, 4, by = 0.1) PE <- seq(1, 2, by = 0.1) # 创建用于存储结果的矩阵(提前指定维度) results <- matrix(nrow = length(PE), ncol = length(w)) # 循环计算:用索引k、l定位矩阵位置 for(k in seq_along(PE)){ i <- PE[k] # 取出当前PE的数值 for(l in seq_along(w)){ j <- w[l] # 取出当前w的数值 # 将计算结果赋值到矩阵的第k行第l列 results[k, l] <- 1 + i - (1 + (i^j))^(1/j) } } # 验证结果维度:应该是11行31列 dim(results) # 查看前几行结果 head(results)
补充说明
seq_along(PE)会生成从1到length(PE)的整数序列,正好对应矩阵的行索引;同理seq_along(w)对应列索引。- 提前创建好固定维度的矩阵,再通过索引填充,就能保证结果的结构符合预期,不会被覆盖或扩展出多余的NA。
内容的提问来源于stack exchange,提问作者Drop
相关产品推荐
相关产品推荐

