15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
# File 'lib/rbbt/matrix/barcode.rb', line 15
def barcode_ruby(outfile, factor = 2)
parser = TSV::Parser.new self.data_file
dumper = TSV::Dumper.new parser.options.merge(:type => :list, :cast => :to_i)
dumper.init
TSV.traverse parser, :into => dumper, :bar => "Barcoding #{self.data_file}" do |key,values|
clean_values = values.flatten.compact.collect{|v| v.to_f}
modes = R.eval("rbbt.get.modes(#{R.ruby2R clean_values})$modes")
mode = Array === modes ? modes.first : modes
mode_values = clean_values.select{|v| v.to_f <= mode}
mode_values.concat mode_values.collect{|v| v+mode}
sd = Misc.sd mode_values
if sd.nil?
[key, [nil] * values.length]
else
threshold = mode + sd
bars = if Array === values.compact.first
values.collect do |v|
Misc.mean(v.compact.collect{|v| v.to_f}) > threshold ? 1 : 0
end
else
values.collect do |v|
v.to_f > threshold ? 1 : 0
end
end
key = key.first if Array === key
[key, bars]
end
end
Misc.sensiblewrite(outfile, dumper.stream)
end
|