Hi,
ok. I actually continue using my code as I feel more familiarize with it but did accordingly to how you advise me and I can come out with the output I want:
while(<CURINFILE>)
{
push @full_data , [split] while (<CURINFILE>);
for $arr_ref1 (@full_data)
{
for $arr_ref2(@full_data)
{
$variable1 = '';
$variable2 = '';
for my $index1 (3..4)
{
$ratio1 = sprintf( "%.4f%s", $$arr_ref2[$index1]/$$arr_ref1
+[$index1],"\t");
$variable1 .= $ratio1;
}
for my $index2 (5..6)
{
$ratio2 = sprintf( "%.4f%s", $$arr_ref2[$index2]/$$arr_ref1
+[$index2],"\t");
$variable2 .= $ratio2;
}
#Calculate Average
@arrayint1 = split (/\t/,$variable1);
$avg1 = &average (\@arrayint1);
#print OUT1 "\t$avg1";
@arrayint2 = split (/\t/,$variable2);
$avg2 = &average (\@arrayint2);
#print OUT1 "\t$avg2";
#Calculate SD
@arrayint1 = split (/\t/,$variable1);
$std1 = &stdev(\@arrayint1);
#print OUT1 "\t$std1";
@arrayint2 = split (/\t/,$variable2);
$std2 = &stdev(\@arrayint2);
#print OUT1 "\t$std2";
#Calculate CV
$cv1 = $std1/$avg1;
$cv2 = $std2/$avg2;
my $outputa = "$$arr_ref1[0]";
my $outputb = "$variable1\t$variable2\t";
my $outputc = "\t$avg1\t$avg2";
my $outputd = "\t$cv1\t$cv2";
###### print everything out #####################
my $key = "$outputa"."$outputb". "$outputc"."outputd";
print OUT1 $key;
print OUT1 "\n";
}
}
sub average{
my($data) = @_;
if (not @$data) {
die("Empty array\n");
}
my $total = 0;
foreach (@$data) {
$total += $_;
}
my $average = $total / @$data;
return $average;
}
sub stdev{
my($data) = @_;
if(@$data == 1){
return 0;
}
my $average = &average($data);
my $sqtotal = 0;
foreach(@$data) {
$sqtotal += ($average-$_) ** 2;
}
my $std = ($sqtotal / (@$data-1)) ** 0.5;
return $std;
}
so the output will be :
_OUTPUT_
M446T27 1 1 1 1 1 1 0 0
M446T27 1.75 2.66 1.80 2.16 2.20 1.98 0.29 0.12
M446T27 1.00 1.64 0.99 1.09 1.32 1.04 0.34 0.06
.
.
So far so good. Phew! Thanks to your guidance! :)
My next question is, is it possible to actually filter the whole row based on the outputd(set condition)?
(not sure if it should be put into a new thread?)