次のようなデータセットがあります
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を簡単に取得できます。
5. 注意事項
- 実際のデータセットには、最大 400 の数字で構成される各行があり、それより少ない行もあれば、まったくない行もありますが、400 を超えることはありません。
2.実際のデータセットには 41,382 行あります。Set1 は 23,558 行で構成され、set2 は 17,824 行で構成されます。
3.ファイルは .txt ファイルで、各行のすべての数字はタブで区切られています。
最大平均の平均を計算する方法について、いくつかのアイデアを提供できれば幸いです。使おうと思ったのpush @10avgset1, $average_max1
ですが、なかなか使えません。