R语言嵌套循环输出矩阵重复结果 q/p索引未与j同步问题修复
R嵌套循环结果矩阵行重复故障修复
问题根因
- 循环嵌套逻辑错误:原代码将行索引
q的遍历放在国家列循环j的内层,每处理1个国家,就会遍历所有国家对应的行位置并写入计算结果,最终所有行都会被最后一个处理的国家的结果覆盖,直接导致全表行数值重复。核心问题和你预判的一致,就是q/p没有和国家序号j绑定同步。 - 存在冗余无效循环:最内层
for (i in sort(percentage)[a])是多余嵌套,每次循环仅取单个值,没有实际遍历意义,还会增加不必要的计算开销。
修复后完整代码
OLS.table <- matrix(nrow = length(colnames(R.index)) * 2, ncol = 6) rownames(OLS.table) <- c("GE", "", "FR", "", "NL", "", "BE", "", "IT", "", "SP", "", "AU", "", "CH", "", "IN", "", "MX", "", "SA", "", "PO", "", "MA", "") colnames(OLS.table) <- rep(c("5%", "7.5%", "10%"), 2) percentage <- c(0.05, 0.075, 0.1) for (j in 1:length(colnames(R.index))) { # 直接绑定当前国家对应的行位置,无需单独遍历q q <- 2 * j - 1 p <- q + 1 for (a in 1:3) { i <- percentage[a] start <- round(i * length(R.index[, j])) # 右尾计算 size <- sort(coredata(R.index[, j]), decreasing = TRUE)[1:start] Rank <- sort(rank(coredata(R.index[, j]), na.last = FALSE), decreasing = TRUE)[1:start] # 左尾计算 size1 <- sort(coredata(R.index[, j]), decreasing = FALSE)[1:start] Rank1 <- sort(rank(coredata(R.index[, j]), na.last = FALSE), decreasing = FALSE)[1:start] y <- log(Rank - 1/2) y1 <- log(Rank1 - 1/2) size.log <- log(size) size1.log <- log(size1) OLS.table[q, a] <- round(coef(lm(y ~ size.log))[2], 3) OLS.table[q, a + 3] <- round(coef(lm(y1 ~ size1.log))[2], 3) OLS.table[p, a] <- round(sd(size), 3) OLS.table[p, a + 3] <- round(sd(size1), 3) } }
修复要点
- 删除了错误嵌套的
q全量行遍历逻辑,直接通过当前国家序号j计算对应的两个行位置,保证每个国家的计算结果只会写入自身所属行,不会出现跨位置覆盖。 - 移除了冗余的单元素
i循环,直接在分位遍历层取对应阈值,精简循环结构。 - 修复后每个国家的左右尾幂律回归系数、尾部分布标准差会独立计算,不会再出现全表行重复的问题。
内容的提问来源于stack exchange,提问作者Anne
相关产品推荐
相关产品推荐

