我有一个如下所示的数据集
1. 数据集
NR_046018 DDX11L1 , 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1.44 2.72 3.84 4.92
NR_047520 LOC643837 , 3 2.2 0.2 0 0 0.28 1 1 1 1 2.2 4.8 5 5.32 5 5 5 5 3
NM_001005484 OR4F5 , 2 2 2 1.68 1 0.48 0 0.92 1 1.8 2 2 2 2.04 3.88 3
NR_028327 LOC100133331 , 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2. 需要什么
将数组洗牌 10 次。每次洗牌后,将数组分成 2 个新数组,例如set1和set2。(一半进入set1另一半进入set2)
从每个新数组中,计算每行数字的最大值,然后计算所有行的平均最大值。
获取每个set1和set2的 10 个平均最大值。(10 次随机播放的 10 个平均最大值)计算每个集合获得的 10 个平均最大值的平均值,我们称之为10avg1和10avg2。
获取 1000 10avg2和 1000 10avg2的列表。
3.代码
use warnings;
use List::Util qw(max shuffle);
my $file = 'mergesmall.txt';
#Open file and output file
open my $fh,'<',$file or die "Unable to open file";
open OUT,">Shuffle.out" or die;
#Read into array
my @arr = <$fh>;
#Intialize loop for shuffling 10 times
my $i=10;
while($i){
my @arr1 = (); #Intitialize 1st set
my @arr2 = (); #Initialize 2nd set
my @shuffled = shuffle(@arr);
push @arr1,(@shuffled[0..1]); #Shift into 1st set
push @arr2,(@shuffled[2..3]); #Shift into 2nd set
foreach $_(@arr1){
my @val1 = split;
my $max1 = max(@val1[3..$#val1]);
$total1 += $max1;
$num1++;
}
my $average_max1 = $total1 / $num1;
#print "\n\n","Average max 1st set is : ",$average_max1;
print OUT "Average max 1st set is : ",$average_max1;
foreach $_(@arr2){
my @val2 = split;
my $max2 = max(@val2[3..$#val2]);
print "\n\n";
$total2 += $max2;
$num2++;
}
my $average_max2 = $total2 / $num2;
#print "\n\n","Average max 2nd set is : ",$average_max2;
print OUT "\n","Average max 2nd set is : ",$average_max2,"\n\n";
$i--;
}
4.问题
到目前为止,我能够编写的代码可以获得每个set1和set2的 10 个最大平均值。我无法弄清楚如何计算这 10 个最大平均值的平均值。如果我能弄清楚这一点,我可以轻松地for
循环运行 1000 次并获得 1000 10avgset1和 1000 10avgset2
五、注意事项
- 实际数据集的每一行最多包含 400 个数字,有些行少于这个数,有些根本没有,但从不超过 400 个。
2.实际数据集有41,382行。Set1 将包含 23,558 行,而 set2 将包含 17,824 行。
3.File 是一个.txt 文件,每行中的所有数字都是制表符分隔的。
如果可以就如何计算最大平均值的平均值提供一些想法,我将不胜感激。我曾想过使用push @10avgset1, $average_max1
,但我无法使其工作。