我有这个数组:
[288.563044, 329.835918, 578.622569, 712.359026, 866.614253, 890.066321, 1049.78037, 1070.29897, 2185.443662, 2492.245562, 4398.300227, 13953.264379]
如何从中计算interquartile mean?
维基百科链接解释得最好,但我基本上需要删除底部和前25%,只留下中间50%,其中我需要平均数字。
但是假设数组项的数量可以被4 Here's how to calculate it整除,当它不能被4整除时。
那我该如何做呢?
答案 0 :(得分:4)
这是一个数组的部分解决方案,其中包含多个4的元素。当我弄明白时,我会把完整的元素放在一边。
arr = [288.563044, 329.835918, 578.622569, 712.359026, 866.614253, 890.066321, 1049.78037, 1070.29897, 2185.443662, 2492.245562, 4398.300227, 13953.264379].sort!
length = arr.size
mean = arr.sort[(length/4)..-(length/4+1)].inject(:+)/(length/2)
我认为这是一个更好的解决方案。
def interquartile_mean(array)
arr = array.sort
length = arr.size
quart = (length/4.0).floor
fraction = 1-((length/4.0)-quart)
new_arr = arr[quart..-(quart + 1)]
(fraction*(new_arr[0]+new_arr[-1]) + new_arr[1..-2].inject(:+))/(length/2.0)
end
答案 1 :(得分:2)
简单案例array_size mod 4 = 0
:
xs = [5, 8, 4, 38, 8, 6, 9, 7, 7, 3, 1, 6]
q = xs.size / 4
ys = xs.sort[q...3*q]
mean = ys.inject(0, :+) / ys.size.to_f
#=> 6.5
一般情况(array_size >= 4
):
xs = [1, 3, 5, 7, 9, 11, 13, 15, 17]
q = xs.size / 4.0
ys = xs.sort[q.ceil-1..(3*q).floor]
factor = q - (ys.size/2.0 - 1)
mean = (ys[1...-1].inject(0, :+) + (ys[0] + ys[-1]) * factor) / (2*q)
#=> 9.0
但是,如果您不尝试自己编码,这将无济于事......
答案 2 :(得分:1)
改进了tokland的答案,增加了Array类并修复了一个边缘情况(编写的方法随着数组大小为4而爆炸)。
class Array
def interquartile_mean
a = sort
l = size
quart = (l.to_f / 4).floor
t = a[quart..-(quart + 1)]
t.inject{ |s, e| s + e }.to_f / t.size
end
end