首页 > 解决方案 > 使用 for 和 while 循环在 R 中创建不同长度的范围

问题描述

我想在 R 中创建一个循环,结果保存一个最小大小为 1000(初始 binLength)的范围,并在每次不满足条件时将其大小增加 10 个点(stepSize)。我发送了我拥有的脚本,但没有得到我想要的结果。

set.seed(123)

newbins = seq(0,5000,1000)
binLength = 1000
stepSize = 10
blocks=NULL
end = 0


for (b in newbins[1:length(newbins)-1]){
  tempBP = 0
  tempBP_new = 0
  start = end +1
  end = binLength
  while (sum(tempBP_new-tempBP) < 0.40){
    tempBP_new = tempBP
    tempBP_new = runif(1)*0.5
    binLength = binLength + stepSize
    blocks = rbind(blocks,c(start, end))
  }
}
blocks

脚本的输出是:

      [,1] [,2]
 [1,]    1 1000
 [2,]    1 1000
 [3,]    1 1000
 [4,]    1 1000
 [5,] 1001 1040
 [6,] 1041 1050
 [7,] 1041 1050
 [8,] 1041 1050
 [9,] 1051 1080
[10,] 1051 1080
[11,] 1051 1080
[12,] 1081 1110
[13,] 1081 1110
[14,] 1081 1110
[15,] 1081 1110
[16,] 1081 1110

但我想要类似的东西

   1 1000
1001 2040
2041 3050
3050 5000

换句话说,每个范围必须至少为 1000 并且循环必须在达到 5000 时结束。我也不明白为什么我在循环中多次得到相同的结果。你有什么想法?非常感谢!

标签: rfor-loopwhile-loop

解决方案


我在每次迭代时修改了间隔的结尾,而不是应该保持不变的最小长度。我还通过删除无用的列表或函数调用来简化您的代码。您获得相同结果的原因是因为您在 while 循环中而不是在完成时增加表。另外,我不知道您是否希望间隔的开始或结束低于 5000。无论如何,从那里修复应该相对容易。

set.seed(123)

binLength = 1000
stepSize = 10
blocks = NULL
end = 0

while (end + 1 < 5000){
  tempBP = 0
  tempBP_new = 0
  start = end + 1
  end = end + binLength
  while (tempBP_new - tempBP < 0.40){
    tempBP_new = tempBP
    tempBP = runif(1) * 0.5
    end = end + stepSize
    }
  blocks = rbind(blocks, c(start, min(5000, end)))
  }
blocks
     [,1] [,2]
[1,]    1 1060
[2,] 1061 2510
[3,] 2511 4270
[4,] 4271 5000

编辑:根据评论,我修改了代码以防止间隔结束超过 5000。


推荐阅读