r - 使用 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 时结束。我也不明白为什么我在循环中多次得到相同的结果。你有什么想法?非常感谢!
解决方案
我在每次迭代时修改了间隔的结尾,而不是应该保持不变的最小长度。我还通过删除无用的列表或函数调用来简化您的代码。您获得相同结果的原因是因为您在 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。
推荐阅读
- angular - 由于内容安全策略指令,无法在生产中的 Angular 应用程序中保存 PDF 文件
- c# - 在 F# 中,如何根据某些选项值是否为空来调用具有重载的构造函数?
- javascript - 如何实现基于嵌套数组的 UI?
- reactjs - 在 Redux + 本地存储中使用函数存储对象
- python - 在python中查找字符串中单词完全匹配的所有位置
- java - 无法从文件中读取有效负载
- python - QML/PySide2 可执行文件 - 没有声音
- javascript - 无论页面是否重新加载,一旦关闭就永久隐藏 div
- python - 有没有办法在我的python代码中使用apache beam在某个管道之后创建一个空文件
- ckeditor - 删除在 CKEDITOR 5 中使用 ImageInsert 上传图像的选项