サンプルコードに基づいて、3番目の列のさまざまな用語を1行にまとめます。

サンプルコードに基づいて、3番目の列のさまざまな用語を1行にまとめます。

3つの列を持つゲノムデータがあります。 1列はサンプル、2列はがんタイプ、3列はメカニズムです。各サンプルには、3行目に割り当てられた1つ以上の遺伝子機構があります(例:6 ecDNA)。現在、サンプルごとに各メカニズムに複数の行があります。たとえば、サンプルxには「6 ecDNA」メカニズムの4行と「5削除」メカニズムの5行があり、各行はそのサンプルで見つかった1つの遺伝的異常に対応します。 。

各サンプルのデータにあるすべての種類のメカニズムを1行に表示する方法があるかどうか疑問に思います。

(例:がん略語メカニズム例)

     x        Bladder     6 ecDNA, 5 deletion

サンプルのメカニズムタイプを1行に圧縮する方法はありますか?編集:以下は、サンプル「x」と「y」を含むOGデータセットの代表的なテーブルです。

サンプル、がん略語、メカニズム

 x,       Bladder,         6 ecDNA

 x,       Bladder,         6 ecDNA

 x,       Bladder,         5 deletion

 x,       Bladder,         5 deletion

 y,       Osteosarcoma,    4 transposition

 y,       Osteosarcoma,    4 transposition

y,       Osteosarcoma,    5 deletion

y,       Osteosarcoma,    6 ecDNA

....

ベストアンサー1

#!/usr/bin/perl
use strict;

my %rec;

while(<>) {
  chomp;
  s/^\s+|\s*$//;
  next if m/^$/;

  my ($c1,$c2,$c3) = split /\s{2,}|\t+/;

  $rec{$c1}->{$c2}->{$c3} = 1;
}

# find the largest widths (lengths) of the first two columns, minimum 6 for each
my $l1=6;
my $l2=6;
foreach my $k1 (keys %rec) {
  $l1 = length($k1) if (length($k1) > $l1);
  foreach my $k2 (keys %{ $rec{$k1} }) {
    $l2 = length($k2) if (length($k2) > $l2);
  }
};

# use that to build a format string
my $fmt = "%-${l1}s\t%-${l2}s\t%s\n";

printf $fmt, "Sample", "Cancer", "Mechanisms";

foreach my $k1 (sort keys %rec) {
  foreach my $k2 (sort keys %{ $rec{$k1} }) {
    printf $fmt, $k1, $k2, join(", ",sort keys %{ $rec{$k1}->{$k2} });
  };
}

この Perl スクリプトは、各入力行を読み取り、先行または末尾のスペースを削除し、空行をスキップします。入力ファイルに各列を区切る1つ以上のタブしかないか、複数の空白文字があるかどうかはわかりません。私はそれらの1つを処理するために書いた。

各レコードを保持するために%recというデータ構造を構築します。データ構造は、最初の2つのレベルが最初の2つの列(サンプルと癌)の名前で、3番目のレベルにメカニズムを含む複数レベルのハッシュ(関連付けの配列)です。

つまり、%rec データ構造は次のようになります。

%rec = {
  x => { Bladder => { "5 deletion" => 1, "6 ecDNA" => 1 } },
  y => { Osteosarcoma => { "4 transposition" => 1, "5 deletion" => 1, "6 ecDNA" => 1 }, },
}

Perlデータ構造の詳細については、man perldscまたはを参照してください。これらのデータ構造を作成して使用する方法の簡単なチュートリアルperldoc perldscも参照してください。man perlreftut0

完全な入力ファイルの読み取りが終わったら、各レコードの要約行を印刷します(各列の幅を計算した後)。出力はタブで区切られます。

たとえば、として保存しcombine.plて実行可能にしますchmod +x

$ chmod +x ./combine.pl
$ ./combine.pl input.txt
Sample  Cancer          Mechanisms
x       Bladder         5 deletion, 6 ecDNA
y       Osteosarcoma    4 transposition, 5 deletion, 6 ecDNA

おすすめ記事