2012-01-13 6 views
4

私はこの配列を持っている:Ruby配列から四分位平均を計算しますか?

[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で割り切れると仮定しています。

どうすればいいですか?

+0

具体的に何か問題がありますか?リンクされた記事はアルゴリズムを説明します。 –

+0

Rubyで実際に実装する方法。 – Shpigford

+2

これまでに何がありますか? –

答えて

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 
+0

あなたが変更された配列を操作して結果を返すので、ここでは 'sort 'のバングは必要ありません。また、将来の参照のためだけに、 'Array#length'と' Array#size'(エイリアス)は 'count'よりも高速です。 :) – coreyward

+0

ありがとう!知っておいてよかった。 –

+0

メソッドに属していない配列を '並べ替える 'とは思えません。とにかく+1するつもりですが、この質問は2つのレベルで失望しています。 –

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 

しかし、これは助けにはなりません多く...

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 
関連する問題