r - 使用 R 找到包含数组中 90% 值的最小区间的最简单方法是什么?
问题描述
我得到了 1 到 4 之间的数字数组,但通常它们的最小值和最大值之间的差异不超过 0.5。每个元素之间的差异不小于 0.1。我想找到包含至少 90%(或其他指定比率)元素的最小边距。
也就是说,给定数组
c(1, 1.9, 2, 2, 2, 2, 2.1, 2.2, 2.3, 2.3)
我希望我的函数返回 .4,因为 2.3 - 1.9 = .4 < 2.3 - 1 = 1.3。细节:
- 2.3 - 1.9 来自 90% 长度的子向量,从 1.9 开始一直运行到最后
- 2.3 - 1 来自从 1 开始到第一个 2.3 结束的 90% 长度的子向量
我尝试构建该功能几次,但它一直变得过于复杂,我想知道是否有一种我没有考虑过的简单方法来做到这一点。
编辑:它必须能够满足偏斜分布。自从我不断重构以来,我没有任何完整的代码示例,但我会做一些东西并发布它。
Edit2:我无法提供要输入函数的数组的任何示例,但这是一个用于生成类似值的函数。只要它起作用,它就不会落在 1 到 4 的范围内,这并不重要。
x = round(rbeta(20,5,2)*100)/10
解决方案
最简单的方法是通过测试包括 90% 在内的所有可能范围来进行暴力破解。为此,我们计算出有多少项,以及范围因此可以从哪些索引开始,并计算每个项的差异,然后计算其中的最小值。
x <- c(1, 1.9, 2, 2, 2, 2, 2.1, 2.2, 2.3, 2.3)
n <- ceiling(length(x)*0.9) # get the number of terms needed to include 90%
k <- 1 : (length(x) - n + 1) # get the possible indices the range can start at
x <- sort(x) # need them sorted...
d <- x[k + n - 1] - x[k] # get the difference starting at each range
min(d) # get the smallest difference
推荐阅读
- python - 连接numpy数组切片的最快方法
- c++ - 是否可以使用 nlohmann/json 序列化嵌套/复杂类?
- java - 初始化后如何向 JFrame 添加组件?
- java - 从已知 PID 重新创建 Java 进程对象
- c++ - 整数或浮点变量的 C++ cin/coutSegmentation 错误,但对于 char 类型没问题
- javascript - 使用 OOP 进行事件冒泡
- tcp - TCP KEEP ALIVE Ack 在一段时间内没有看到
- c# - 第二个窗口只恢复到 WindowState.Normal
- angular - ngx-pagination 服务器端分页(从 api 逐页渲染数据)
- android - 如何以编程方式在 android tv 中包含鼠标光标