Module: Enumerable
- Defined in:
- lib/simple_stats/core_ext/enumerable.rb
Instance Method Summary collapse
-
#frequencies(&block) ⇒ Object
This function is oddly written in order to group 1 (integer) and 1.0 (float) together.
- #mean(&block) ⇒ Object
- #median(&block) ⇒ Object
- #modes(&block) ⇒ Object
- #sorted_frequencies(&block) ⇒ Object
- #sum(&block) ⇒ Object
Instance Method Details
#frequencies(&block) ⇒ Object
This function is oddly written in order to group 1 (integer) and 1.0 (float) together. If we loaded a hash or used group_by, 1 and 1.0 would be counted as separate things. Instead, we use the == operator for grouping.
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/simple_stats/core_ext/enumerable.rb', line 53 def frequencies(&block) return map(&block).frequencies if block_given? begin sorted = sort rescue NoMethodError # i.e. undefined method `<=>' for :my_symbol:Symbol sorted = sort_by do |item| item.respond_to?(:"<=>") ? item : item.to_s end end current_item = nil; Hash[ sorted.reduce([]) do |frequencies, item| if frequencies.size == 0 || item != current_item current_item = item frequencies << [item, 1] else frequencies.last[1] += 1 frequencies end end ] end |
#mean(&block) ⇒ Object
10 11 12 13 14 15 16 |
# File 'lib/simple_stats/core_ext/enumerable.rb', line 10 def mean(&block) return map(&block).mean if block_given? count = self.count # count has to iterate if there's no size method return nil if count == 0 (sum / count.to_f).to_f end |
#median(&block) ⇒ Object
20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/simple_stats/core_ext/enumerable.rb', line 20 def median(&block) return map(&block).median if block_given? sorted = sort count = sorted.size i = count / 2 return nil if count == 0 if count % 2 == 1 sorted[i] else ( sorted[i-1] + sorted[i] ) / 2.0 end.to_f end |
#modes(&block) ⇒ Object
37 38 39 40 41 42 43 44 45 46 |
# File 'lib/simple_stats/core_ext/enumerable.rb', line 37 def modes(&block) return map(&block).modes if block_given? sorted_frequencies = self.sorted_frequencies sorted_frequencies.select do |item, frequency| frequency == sorted_frequencies.first[1] end.map do |item, frequency| item end end |
#sorted_frequencies(&block) ⇒ Object
80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/simple_stats/core_ext/enumerable.rb', line 80 def sorted_frequencies(&block) return map(&block).sorted_frequencies if block_given? frequencies.sort_by do |item, frequency| if item.respond_to?(:"<=>") [-frequency, item] else [-frequency, item.to_s] end end end |
#sum(&block) ⇒ Object
3 4 5 6 |
# File 'lib/simple_stats/core_ext/enumerable.rb', line 3 def sum(&block) return map(&block).sum if block_given? inject(0) { |sum, x| sum + x } end |