如何迭代调整变量,直至比值列所有行均满足阈值限制?
实现迭代调整变量直至比值列满足阈值要求
核心思路
通过while循环重复执行调整流程,每次迭代后校验所有行的比值是否符合阈值要求,直到所有行的比值都不超过设定的c_cap为止,完全贴合你描述的流程逻辑实现自动化迭代。
完整可运行代码
set.seed(8) # 生成初始数据 a <- runif(100, min = 0, max = 10) b <- runif(100, min = 0, max = 10) a_norm <- a/sum(a)*100 b_norm <- b/sum(b)*100 c_cap <- 1 # 比值的上限阈值 # 初始化数据框 df <- data.frame(a_norm, b_norm) df$c <- df$a_norm / df$b_norm # 迭代调整流程 while(any(df$c > c_cap)) { # 调整超过阈值的c值,计算调整后的a并重新归一化 df <- df %>% mutate(c_adjusted = ifelse(c >= c_cap, c_cap, c), a_adjusted = c_adjusted * b_norm, a_adjusted_norm = a_adjusted / sum(a_adjusted) * 100) # 更新c值,用于下一轮阈值校验 df$c <- df$a_adjusted_norm / df$b_norm # 可选:打开注释监控迭代进度 # cat("当前超标行数:", sum(df$c > c_cap), "\n") } # 最终结果:满足条件的归一化后a值 final_a_adjusted_norm <- df$a_adjusted_norm
代码说明
- 循环触发逻辑:
any(df$c > c_cap)会检查是否存在比值超标的行,只要有就继续迭代; - 每轮迭代操作:
- 把超过
c_cap的比值替换为阈值; - 用调整后的比值反推得到
a_adjusted; - 对
a_adjusted重新做归一化处理; - 计算新的比值用于下一轮校验;
- 把超过
- 终止条件:当所有行的比值都≤
c_cap时,循环自动退出,此时的a_adjusted_norm就是最终目标结果。
内容的提问来源于stack exchange,提问作者Andres Gonzalez
相关产品推荐
相关产品推荐

