Module: CrossTable::Grouping
- Defined in:
- lib/cross_table/grouping.rb
Overview
group process
Class Method Summary collapse
- .avgs(recs, field, group_rules) ⇒ Object
- .counts(recs, group_rules) ⇒ Object
- .group(recs, group_rules, &aggr_proc) ⇒ Object
- .sums(recs, field, group_rules) ⇒ Object
Class Method Details
.avgs(recs, field, group_rules) ⇒ Object
35 36 37 38 39 40 41 |
# File 'lib/cross_table/grouping.rb', line 35 def avgs(recs, field, group_rules) group(recs, group_rules) do |group_recs| sum = group_recs.map { |r| r[field] }.sum count = group_recs.count sum.to_f / count.to_f end end |
.counts(recs, group_rules) ⇒ Object
25 26 27 |
# File 'lib/cross_table/grouping.rb', line 25 def counts(recs, group_rules) group(recs, group_rules, &:count) end |
.group(recs, group_rules, &aggr_proc) ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/cross_table/grouping.rb', line 8 def group(recs, group_rules, &aggr_proc) all_titles = product_all(group_rules.map(&:keys)) all_procs = product_all(group_rules.map(&:values)) auto_dig_hash = Hash.new { |h, k| h[k] = h.class.new(&h.default_proc) } all_titles.zip(all_procs).each do |dig_keys, filter_procs| group_recs = filter_procs.reduce(recs) do |memo, proc| memo.select(&proc) end value = aggr_proc[group_recs] last_key = dig_keys.pop auto_dig_hash.dig(*dig_keys).store(last_key, value) end auto_dig_hash end |
.sums(recs, field, group_rules) ⇒ Object
29 30 31 32 33 |
# File 'lib/cross_table/grouping.rb', line 29 def sums(recs, field, group_rules) group(recs, group_rules) do |group_recs| group_recs.map { |r| r[field] }.sum end end |