Ms Pivot
by vWorkApp
A little gem to help you pivot your arrays.
my_array = [
["ProductA", "AU", 1],
["ProductA", "AU", 2],
["ProductB", "NZ", 3],
["ProductB", "US", 4],
]
pv = MsPivot::Table.new(my_array, 0, 1, MsPivot::SUM)
puts pv.inspect
# AU NZ US
# ProductA 3 - -
# ProductB - 3 4
Install
sudo gem install ms_pivot
Usage
Specify which items (indicies) to use as row and column headers. All remaining items must have a measure specified.
my_array = [ ["ProductA", "AU", 1, "x"], ["ProductA", "AU", 2, "t"], ["ProductB", "NZ", 3, "z"], ["ProductB", "US", 4, "a"], ] pv = MsPivot::Table.new(my_array, 0, 1, MsPivot::SUM, MsPivot::COUNT)
Item 0 is used as the row headers, item 1 is used as the column headers, item 2 and 3 are aggregated (summed and counted respectively).
Use of of the following built-in measures (i.e. methods to aggregate the grouped data)
- MSPivot::SUM
- MSPivot::COUNT
- MSPivot::AVG
- MSPivot::MIN
- MSPivot::MAX
- MSPivot::APPEND (builds an array)
Or specify your own measure function
pv = MsPivot::Table.new(orig_array, 0, 1, MsPivot::Measure.new { |current_value, new_value| # sum of squares current_value ||= 0 current_value + (new_value ** 2) end
Let Ms Pivot work out automatically what the column headers are from the data (in which case it'll order them alphabetically) or tell it explicitly what columns you want
pv = MsPivot::Table.new(orig_array, 0, 1, MsPivot::SUM) pv.column_headers = ["AU", "US", "UK"]
Get the results out as an array
a = pv.column_headers b = pv.to_a # a = ["AU", "NZ", "US"] # b = [ # ["ProductA", [3, 2], [], []], # ["ProductB", [], [3, 1], [4, 1]] # ]
Or iterate over them
pv.each do |row_header, columns| do columns.each do |col_header, values| do values.each do |value| // do stuff end end end
See /spec/pivot_spec.rb for some examples of Ms Pivot being used.
Todo
- Write RDOC
Copyright
Copyright (c) 2010 VisFleet. See LICENSE for details.