2

4 番目の列で編成されたタブ区切りのデータ配列から合計の移動ウィンドウを作成したいと考えています。簡単にするために、無関係なフィールドを X に置き換え、最初の行に表示されるヘッダーを追加しました。

ID-Counts    X      X     Start    X      X     Locations      XXXX
 X-5000     [X]    [X]     0      [X]    [X]      1           [X...]
 X-26       [X]    [X]     1      [X]    [X]      1           [X...]
 X-34       [X]    [X]     1      [X]    [X]      0           [X...]
 X-3        [X]    [X]     20     [X]    [X]      9           [X...]
 X-200      [X]    [X]     30     [X]    [X]      0           [X...]
 X-1        [X]    [X]     40     [X]    [X]      5           [X...]

最初の列には、ハイフンで結合された数値 ID とその ID のカウントが含まれます。4 番目の列には、データのグループ化に使用するすべての開始サイトが含まれています。7 番目の列には、カウントを正規化するために必要な場所の数が含まれています。

行ごとに合計したい全体の値は、ID からカウントを分割し、それらを場所の数 + 1 で割ることによって決定されます (たとえば、最初の行の値は 2500、行 2 の値は 13、行 3 です)と 34)。次に、値 0 ~ 19、次に 1 ~ 20、2 ~ 21 などで始まり、互いに 20 ユニット以内の列 4 に値を持つすべての行について、これらのカウント/(場所 + 1) を合計したいと思います。たとえば、ウィンドウ 0 (列 4 の値は 0 ~ 19 の範囲) は行 1 ~ 3 を合計し、ウィンドウ 1 は行 2 ~ 4 を合計し、ウィンドウ 2 は行 4 のみを合計する、というようになります。

私の理想的な出力は 2 つの列になります。最初の列には 20unit-window (0,1,2,...) の始まりがあり、2 番目の列には各ウィンドウの合計 (上記のデータでは 2547、47.3 など) があります。 )。

データをフィルタリングしてこの形式に整理する perl スクリプトを作成し、20 単位のウィンドウ全体で合計するためのコードを追加したいと考えています。perl初心者として、助けと説明をいただければ幸いです。私は列全体の分割および算術関数に精通していますが、配列内の移動ウィンドウ全体でこれらを行う方法について完全に迷っています。ありがとうございました。

4

3 に答える 3

0

あなたの質問をよく理解できれば幸いです。これらの実装についてどう思いますか?

解決策 1: ユニット ウィンドウ (20) に到達するたびに出力ファイルに書き込みます。

#Assuming that you have an array of sums (@sums) and name of file ($filename)
my $window_no  = 20;
my $window_sum = 0;
my @window_nos = ();

for (my $i = 1; $i <= $#sums; $i++) {
    push (@window_nos, $i);
    if ( i % window_no == 0 ) {
        write_file($filename, join(',', @window_nos) . "\t" . $window_sum . "\n");
        $window_sum = 0;
        @window_nos = ();
    }
}


if (scalar @window_nos > 1) {
    write_file($filename, join(',', @window_nos) . "\t" . $window_sum) . "\n");
} 

解決策 2: スカラー変数に値を追加し、それを使用して出力ファイルに 1 回書き込みます。

#Assuming that you have an array of sums (@sums) and name of file ($filename)
my $window_no     = 20;
my $window_sum    = 0;
my @window_nos    = ();
my $file_contents = '';

for (my $i = 1; $i <= $#sums; $i++) {
    push (@window_nos, $i);
    if (i % window_no == 0) {            
        $file_contents .= join(',', @window_nos) . "\t" . $window_sum . "\n";
        $window_sum = 0;
        @window_nos = ();
    }
}

if (scalar @window_nos > 1) {
    $file_contents .= join(',', @window_nos) . "\t" . $window_sum . "\n";
}

write_file($filename, $file_contents);
于 2012-11-21T02:45:54.260 に答える