我得到了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