2012-06-07 3 views
2

У меня есть встроенный хэш, для которого мне нужно рассчитать средние значения. Я уже сгруппировали их, успешно (от разгруппированы), но нахождение в среднем не работает для меняусредняющие значения, встроенные в ruby ​​hash

Вот пример хэширования данных

myhash = {"2011-02-15"=>[["2011-02-15", 10], ["2011-02-15", 60]], 
      "2011-02-22"=>[["2011-02-22", 22]], 
      "2011-02-28"=>[["2011-02-28", 110],["2011-02-28", 70]]} 

вот как я сгруппировал их (они используются для быть просто {к => v} разгруппировать)

@r = @myhash.group_by(&:first) 

Я попробовал оба решения из этого потока (What's the best way in Ruby to average sets in an array?), но ни работал.

хорошо вопрос. Я хочу, чтобы результаты были усреднены по дате, поэтому я могу обслуживать их таким образом.

[{"2012-02-15" => 35"}, {"2012-02-22" => 22"}, {"2012-02-28" => 90"}] 
+1

Как усредняет кучу строк определяется? Чего вы хотите, чтобы результат был? – Linuxios

ответ

6
Hash[myhash.map { |k,v| [k, v.map(&:last).inject(:+)/v.size] }] 
#=> {"2011-02-15"=>35, "2011-02-22"=>22, "2011-02-28"=>90} 
+0

Ты быстро; Я медленный. – Larsenal

+0

Ничего себе. Можете ли вы объяснить, как работает инъекция в этом случае? Я жестко ожидал объект и блок. –

+2

@ismaelga 'inject' может принимать символ для метода« впрыскивания »между каждым значением, вызывая этот метод в« memo »с текущим элементом. Поэтому 'inject (: +)' расширяется до 'injection {| memo, obj | memo. + (obj)} '. Когда вы не даете 'inject' начальное значение, оно просто использует первый элемент. [Docs] (http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-inject) стоит прочитать ':)'. –

0

В рельсах, Array класса имеет метод sum. Вы можете использовать его следующим образом:

подход 1

{}.tap{ |h| myhash.each{ |date, list| h[date] = list.sum(&:last)/list.size} 

подход 2

Hash[myhash.map{ |date, list| [date, list.sum(&:last)/list.size] }] 
Смежные вопросы