storing and manipulating columns of data

Discussion in 'Ruby' started by baptiste Auguié, Jun 30, 2007.

  1. Hi,

    Being used to deal with Octave / Matlab, I'm a bit confused by Ruby
    structures (arrays, hashes, etc). I have this data file "data.dat"
    with 3 columns:


    > 1.240000 9.990000e-01 1.290000e-06
    > 1.550000 1.000000e+00 2.920000e-06
    > 2.066000 1.002000e+00 8.360000e-06
    > 2.480000 1.001000e+00 1.520000e-05
    > 2.755000 1.001000e+00 2.210000e-05
    > 3.099000 1.003000e+00 3.570000e-05
    > 3.444000 1.003000e+00 3.240000e-05
    > 3.542000 1.003000e+00 1.720000e-05
    > 4.133000 1.001000e+00 1.430000e-05
    > 4.959000 1.001000e+00 2.400000e-05
    > 6.199000 1.001000e+00 4.720000e-05
    > 8.265000 9.990000e-01 1.210000e-04


    I would like to think of the columns as arrays "a", "b", "c", execute
    a loop along their indices, pick the values i want, and do something
    with them. What would be a sensible data structure for this?
    I can read this datafile line by line using IO:readlines("data.dat"),
    but I cannot find a way to refer to one column in the array of
    strings generated.


    Best regards,

    baptiste
    baptiste Auguié, Jun 30, 2007
    #1
    1. Advertising

  2. baptiste Auguié

    Alex Young Guest

    baptiste Auguié wrote:
    > Hi,
    >
    > Being used to deal with Octave / Matlab, I'm a bit confused by Ruby
    > structures (arrays, hashes, etc). I have this data file "data.dat" with
    > 3 columns:
    >
    >
    >> 1.240000 9.990000e-01 1.290000e-06
    >> 1.550000 1.000000e+00 2.920000e-06
    >> 2.066000 1.002000e+00 8.360000e-06
    >> 2.480000 1.001000e+00 1.520000e-05
    >> 2.755000 1.001000e+00 2.210000e-05
    >> 3.099000 1.003000e+00 3.570000e-05
    >> 3.444000 1.003000e+00 3.240000e-05
    >> 3.542000 1.003000e+00 1.720000e-05
    >> 4.133000 1.001000e+00 1.430000e-05
    >> 4.959000 1.001000e+00 2.400000e-05
    >> 6.199000 1.001000e+00 4.720000e-05
    >> 8.265000 9.990000e-01 1.210000e-04

    >
    > I would like to think of the columns as arrays "a", "b", "c", execute a
    > loop along their indices, pick the values i want, and do something with
    > them. What would be a sensible data structure for this?
    > I can read this datafile line by line using IO:readlines("data.dat"),
    > but I cannot find a way to refer to one column in the array of strings
    > generated.

    In native Ruby, the only way to do that would be:

    arr = [[0,1],[2,3],[4,5]]
    arr.map{|a| a[0]}
    # => [0,2,4]

    If you can install rb-gsl (and it's probably a good idea if you're
    expecting to do matlab/octavey things), then there's the
    GSL::Matrix#column method which (as I understand it, not being a heavy
    GSL user) actually gives a reference into the original matrix, rather
    than copying to a new one as Array#map does.

    --
    Alex
    Alex Young, Jun 30, 2007
    #2
    1. Advertising

  3. baptiste Auguié

    Tim Hunter Guest

    baptiste Auguié wrote:
    > Hi,
    >
    > Being used to deal with Octave / Matlab, I'm a bit confused by Ruby
    > structures (arrays, hashes, etc). I have this data file "data.dat"
    > with 3 columns:
    >
    > I would like to think of the columns as arrays "a", "b", "c", execute
    > a loop along their indices, pick the values i want, and do something
    > with them. What would be a sensible data structure for this?
    > I can read this datafile line by line using IO:readlines("data.dat"),
    > but I cannot find a way to refer to one column in the array of strings
    > generated.
    >

    You can use String#split to split each line into an array of 3 numbers.
    If you want to use the array values as numbers, you'll need to use
    String#to_f as well to convert the strings to numeric values.

    ri String#split
    ri String#to_f

    --
    RMagick OS X Installer [http://rubyforge.org/projects/rmagick/]
    RMagick Hints & Tips [http://rubyforge.org/forum/forum.php?forum_id=1618]
    RMagick Installation FAQ [http://rmagick.rubyforge.org/install-faq.html]
    Tim Hunter, Jun 30, 2007
    #3
  4. On Jun 30, 2007, at 6:37 AM, baptiste Augui=E9 wrote:

    > Being used to deal with Octave / Matlab, I'm a bit confused by Ruby =20=


    > structures (arrays, hashes, etc). I have this data file "data.dat" =20
    > with 3 columns:
    >
    >
    >> 1.240000 9.990000e-01 1.290000e-06
    >> 1.550000 1.000000e+00 2.920000e-06
    >> 2.066000 1.002000e+00 8.360000e-06
    >> 2.480000 1.001000e+00 1.520000e-05
    >> 2.755000 1.001000e+00 2.210000e-05
    >> 3.099000 1.003000e+00 3.570000e-05
    >> 3.444000 1.003000e+00 3.240000e-05
    >> 3.542000 1.003000e+00 1.720000e-05
    >> 4.133000 1.001000e+00 1.430000e-05
    >> 4.959000 1.001000e+00 2.400000e-05
    >> 6.199000 1.001000e+00 4.720000e-05
    >> 8.265000 9.990000e-01 1.210000e-04

    >
    > I would like to think of the columns as arrays "a", "b", "c", =20
    > execute a loop along their indices, pick the values i want, and do =20
    > something with them. What would be a sensible data structure for this?
    > I can read this datafile line by line using IO:readlines=20
    > ("data.dat"), but I cannot find a way to refer to one column in the =20=


    > array of strings generated.


    Maybe something like this is what you're looking for:

    <code>
    data =3D DATA.readlines
    rows =3D data.map do |row|
    row.split(/\s+/).map { |elt| elt.to_f }
    end
    a, b, c =3D rows.transpose
    p a, b, c
    __END__
    1.240000 9.990000e-01 1.290000e-06
    1.550000 1.000000e+00 2.920000e-06
    2.066000 1.002000e+00 8.360000e-06
    2.480000 1.001000e+00 1.520000e-05
    </code>

    <result>
    [1.24, 1.55, 2.066, 2.48]
    [0.999, 1.0, 1.002, 1.001]
    [1.29e-06, 2.92e-06, 8.36e-06, 1.52e-05]
    </result>


    Regards, Morton
    Morton Goldberg, Jun 30, 2007
    #4
  5. baptiste Auguié

    Axel Etzold Guest

    Axel Etzold, Jun 30, 2007
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. helpful sql
    Replies:
    0
    Views:
    798
    helpful sql
    May 19, 2005
  2. Replies:
    5
    Views:
    580
  3. toton
    Replies:
    11
    Views:
    700
    toton
    Oct 13, 2006
  4. Jonathan Wood
    Replies:
    1
    Views:
    499
    Jonathan Wood
    Jun 2, 2008
  5. Replies:
    0
    Views:
    111
Loading...

Share This Page