Module: Enumerable

Defined in:
lib/simple_stats/core_ext/enumerable.rb

Instance Method Summary collapse

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