首页 > 解决方案 > 使用 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。细节:

我尝试构建该功能几次,但它一直变得过于复杂,我想知道是否有一种我没有考虑过的简单方法来做到这一点。

编辑:它必须能够满足偏斜分布。自从我不断重构以来,我没有任何完整的代码示例,但我会做一些东西并发布它。

Edit2:我无法提供要输入函数的数组的任何示例,但这是一个用于生成类似值的函数。只要它起作用,它就不会落在 1 到 4 的范围内,这并不重要。

x = round(rbeta(20,5,2)*100)/10

标签: r

解决方案


最简单的方法是通过测试包括 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

推荐阅读