2D array to array of hashes with repeating header

I have this array:
data = [[:time, :pressure],[0,2.3],[1,4.1],[2,7.56],...]

All the arrays in data could have an arbitrary number of items in it and
the total number of arrays in data is arbitrary but all arrays will be
the same size and the first array will always be the "header" array.

I need to convert data to an array that looks like this:

new_data =
[{:time=>0,:pressure=>2.3},{:time=>1,:pressure=>4.1},{:time=>2,:pressure=>7.56}]

Is there a straight forward way to set this up? I'm happy with hints.
Thank you!

···

--
Posted via http://www.ruby-forum.com/.

This is destructive. If you want to keep the original data too, you can
implement the same process slightly differently, but this was just cleaner.

to_convert = [[:time, :pressure],[0,2.3],[1,4.1],[2,7.56]]

header = to_convert.shift

to_convert.map! do |ary|
  hsh = Hash.new
  ary.each_with_index{|val,index| hsh[header[index]] = val }
  hsh
end

to_convert # => [{:pressure=>2.3, :time=>0}, {:pressure=>4.1, :time=>1},
{:pressure=>7.56, :time=>2}]

···

On Sun, Sep 27, 2009 at 1:10 AM, Jason Lillywhite < jason.lillywhite@gmail.com> wrote:

I have this array:
data = [[:time, :pressure],[0,2.3],[1,4.1],[2,7.56],...]

All the arrays in data could have an arbitrary number of items in it and
the total number of arrays in data is arbitrary but all arrays will be
the same size and the first array will always be the "header" array.

I need to convert data to an array that looks like this:

new_data =

[{:time=>0,:pressure=>2.3},{:time=>1,:pressure=>4.1},{:time=>2,:pressure=>7.56}]

Is there a straight forward way to set this up? I'm happy with hints.
Thank you!
--
Posted via http://www.ruby-forum.com/.

# I test this in ruby 1.9.1
result = data[1..-1].map{|e| Hash[data[0].zip(e)]}

# And this should work for all version
result = data[1..-1].map{|e| data[0].zip(e).inject({}){|x,y|
x[y[0]]=y[1]; x}}

···

--
Posted via http://www.ruby-forum.com/.

data = [[:time, :pressure],[0,2.3],[1,4.1],[2,7.56],...]
axes = data.shift #shift the axes labels out from the data set
new_data = data.collect{|point| {axes[0] => point[0], axes[1] => point
[1]}} #pair the axes with the data by iterating and collecting the
results

Tim

···

On Sep 26, 11:10 pm, Jason Lillywhite <jason.lillywh...@gmail.com> wrote:

I have this array:
data = [[:time, :pressure],[0,2.3],[1,4.1],[2,7.56],...]

All the arrays in data could have an arbitrary number of items in it and
the total number of arrays in data is arbitrary but all arrays will be
the same size and the first array will always be the "header" array.

I need to convert data to an array that looks like this:

new_data =
[{:time=>0,:pressure=>2.3},{:time=>1,:pressure=>4.1},{:time=>2,:pressure=>7 .56}]

Is there a straight forward way to set this up? I'm happy with hints.
Thank you!
--
Posted viahttp://www.ruby-forum.com/.

Josh Cheek wrote:

to_convert = [[:time, :pressure],[0,2.3],[1,4.1],[2,7.56]]

header = to_convert.shift

to_convert.map! do |ary|
  hsh = Hash.new
  ary.each_with_index{|val,index| hsh[header[index]] = val }
  hsh
end

to_convert # => [{:pressure=>2.3, :time=>0}, {:pressure=>4.1, :time=>1},
{:pressure=>7.56, :time=>2}]

Thank you. I have a question about this. I tried this and accidentally
initialized the variable 'hsh' outside the map! method and could not get
the correct result. I'm curious why this is wrong:

header = to_convert.shift
hsh = Hash.new
to_convert.map! do |ary|
  ary.each_with_index{|val,index| hsh[header[index]] = val }
  hsh
end

to_convert # => [{:pressure=>7.56, :time=>2}, {:pressure=>7.56,
:time=>2}, {:pressure=>7.56, :time=>2}]

Thank you.

···

--
Posted via http://www.ruby-forum.com/.

Because in this case you are using the same object (referenced by hsh)
for all iterations (map!). Map collects (:)) all results from the
blocks and puts them into an array. In your case, all iterations are
returning the same object (hsh), and so your resulting array contains
exactly the same values in all positions: in fact they are the *same*
object. You can check this with object_id. In the proposed solution a
new Hash object is created for each iteration, and so each position in
the resulting array is a different object.

Jesus.

···

On Thu, Oct 1, 2009 at 9:00 PM, Jason Lillywhite <jason.lillywhite@gmail.com> wrote:

Josh Cheek wrote:

to_convert = [[:time, :pressure],[0,2.3],[1,4.1],[2,7.56]]

header = to_convert.shift

to_convert.map! do |ary|
hsh = Hash.new
ary.each_with_index{|val,index| hsh[header[index]] = val }
hsh
end

to_convert # => [{:pressure=>2.3, :time=>0}, {:pressure=>4.1, :time=>1},
{:pressure=>7.56, :time=>2}]

Thank you. I have a question about this. I tried this and accidentally
initialized the variable 'hsh' outside the map! method and could not get
the correct result. I'm curious why this is wrong:

header = to_convert.shift
hsh = Hash.new
to_convert.map! do |ary|
ary.each_with_index{|val,index| hsh[header[index]] = val }
hsh
end

to_convert # => [{:pressure=>7.56, :time=>2}, {:pressure=>7.56,
:time=>2}, {:pressure=>7.56, :time=>2}]