我得到了1到4之间的数字数组,但通常它们的最小值和最大值之间的差不超过0.5。每个元素之间的差异不小于.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.9来自长度为90%的子向量,从1.9开始一直到结束
2.3-1来自长度为90%的子向量,从1开始到第2.3个结束


我尝试过几次构建函数,但是它却变得越来越复杂,我想知道是否有一种我没有考虑过的简单方法。

编辑:它必须能够满足偏斜的分布。自从我不断重建代码以来,我还没有完整的代码示例,但是我会做一些事情并将其发布。

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

09-18 08:26