連続した数値を範囲に縮小して平均を求める方法

連続した数値を範囲に縮小して平均を求める方法

4列と数千行には、次の情報を含む.txtファイルがたくさんあります。

chr10 73121691 18 SLC29A3
chr10 73121692 14 SLC29A3
chr10 73121693 10 SLC29A3
chr10 73120590 15 SLC29A3
chr10 73120591 15 SLC29A3
chr10 73120592 6 SLC29A3
chr10 12345678 25 COL1A1
chr10 12345679 8 COL1A1
chr10 12345680 6 COL1A1
chr17 48431036 5 LRP5
chr17 48431037 8 LRP5
chr17 48431038 5 LRP5

私が望む出力は次のとおりです。

chr10 73121691 - 73121693 , 14, SLC29A3
chr10 73120590 - 73120592 , 12, SLC29A3
chr10 12345679 - 12345680 , 13, COL1A1
chr17 48431036 - 48431038 , 6, LRP5

連続数字の文字#範囲、列3の平均、範囲に関連付けられた名前。

一度に複数のファイルに対してこれを実行するために使用できるスクリプトはありますか?

ありがとう

答え1

すべての生物情報学者が必要とするものデータ統合彼らのツールキットに :)

$ datamash -W groupby 1 min 2 max 2 mean 3 unique 4 < tmp/data.txt
chr10   73121691        73121693        14      SLC29A3
chr17   48431036        48431038        6       LRP5

コマンドライン引数の数字は列を表します。したがって、1列に基づいてグループ化し、2列の最小値と最大値(範囲)、3列の平均、および4列の対応する項目をカンマで区切ったリストを提供します。

答え2

あなたの質問に対する答えに応じて、あなたが望むものかもしれません。私のコメント:

$ cat tst.awk
$2 != (prev[2] + 1) {
    if (NR > 1) {
        prt()
    }
    split($0,beg)
    sum = cnt = 0
}
{
    split($0,prev)
    sum += $3
    cnt++
}
END { prt() }

function prt(   ave) {
    ave = (cnt ? sum / cnt : 0)
    print prev[1], beg[2], "-", prev[2], "," ave ",", prev[4]
}

$ awk -f tst.awk file
chr10 73121691 - 73121693 ,14, SLC29A3
chr10 73120590 - 73120592 ,12, SLC29A3
chr10 12345678 - 12345680 ,13, COL1A1
chr17 48431036 - 48431038 ,6, LRP5

関連情報