Skip to content

Instantly share code, notes, and snippets.

@mat
Created July 18, 2011 21:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mat/1090709 to your computer and use it in GitHub Desktop.
Save mat/1090709 to your computer and use it in GitHub Desktop.
R like stats, command line style
#!/usr/bin/env ruby
#
# Now living in https://github.com/mat/dotfiles
#
class Rlikestats
attr_accessor :values, :count, :mean, :stdev, :lines
def initialize
self.values = []
self.count = 0
self.mean = 0.0
self.lines = 0
end
def run
m2 = 0.0
while line = $stdin.gets
self.lines += 1
unless line =~ /^\d/
$stderr.puts "Skipping line #{lines}: #{line}"
next
end
self.count += 1
val = line.to_f
values << val
delta = val - self.mean
self.mean += delta / count
m2 = m2 + delta * (val - self.mean)
end
variance = m2 / (self.count - 1)
self.stdev = Math.sqrt(variance)
values.sort!
print_result
end
def percentile(pct)
values[(count * pct).floor]
end
def print_result
puts "#Values : %12d" % values.size
puts "Min : %12.4f" % values.first
puts "1st Qu. : %12.4f" % percentile(0.25)
puts "Median : %12.4f" % percentile(0.50)
puts "Mean : %12.4f" % mean
puts "Stdev : %12.4f" % stdev
puts "3rd Qu. : %12.4f" % percentile(0.75)
puts "90th Pct.: %12.4f" % percentile(0.90)
puts "Max : %12.4f" % values.last
end
end
Rlikestats.new.run
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment