Some random rails, and maybe Ruby, questions..

Hi,

I'm attempting to create a users statistics controller, and have saved
up some questions regarding this for this post.
So, please comment on any one of them, if not all :slight_smile:

1) Is there a library somewhere for doing stats? (e.g. mean, median,
sd, skewness..) on an array in rails?
2) What library would you recommend for "publication ready" (i.e. not
cheesy) histograms, scatterplots and barplots?
3) Is there some simple way of doing a frequency table of the values
in an array in Ruby? My solution is

m1.each {|mem| out[mem.age] = 0 }
m1.each {|mem| out[mem.age] += 1 }

where m1 is a collection of members. Are there better solutions?

4) How would I count the number of occurences in an age range? (i.e.
between two values)
5) Converting a Hash to a HTML table seems like a common task. Are
there ready-made functions for this?
6) Is there a way of sorting a collection (of members, in my case) by
one factor, without accessing the database once for each level of the
factor?
E.g. "gender" will have either one of two values... So, if i would
like to get separate my members by gender (Not very PC, I know, but..
:slight_smile: ), do I have to make two different .find calls?

Sorry for the number of questions.. but I am trying to get at grip of
Rails / Ruby and how to do things The RoR way.. :slight_smile:

/Fredrik

If you are going to do multiple operations on the data (ie., view the
same data from a number of different perspectives) you might consider
reading it in once and then doing the operations in Ruby. I think
that might be what you were hinting at with "not going to the db each
time."

With that in mind, 3, 4, and 6 can make use of the "group_by" method
mixed into Array. This method iterates over the collection and builds
a hash in which the keys of the hash are the 'grouping' and the values
are the elements that match that grouping. The 'grouping' is the
result of applying a block. For example:

users_by_age = @users.group_by{|user| user.age}

Now you can iterate over users_by_age:

users_by_age.each_pair do |age, age_collection|
  puts "There are #{age_collection.size} members who are #{age} years
old."
end

Since you have complete control over the block, you can use the same
technique to create bigger bins for your histogram and completely
change the grouping mechanism.

users_by_gender = @users.group_by{|user| user.gender}

this_year = Date.today.year
users_by_decade = @users.group_by{|user| (this_year -
user.born_on.year)/10}

HTH,
AndyV

Fantastic!

Exactly what I was looking for! Just didn't have the imagination
enough to find the group_by method of arrays to be the solution to
almost all my problems.

So, what do I plot this created data set with? Any ideas?

/Fredrik

There are a few more statistics ideas here:
http://derrick.pallas.us/ruby-stats/

Pretty clever and simple solutions for many statistics needs.

Lots of plotting tools... you may want to look at Tioga (http://
tioga.rubyforge.org/) or rgplot (http://rgplot.rubyforge.org/), a Ruby
interface to gnuplot (http://www.gnuplot.info/).