次元(nxn)の行列を行*列の組み合わせの行列に変換

次元(nxn)の行列を行*列の組み合わせの行列に変換

私はこれがそれをよりよく説明すると思います。

次のような行列構造(ファイル)があります。

ファイル1

____   snp1  snp2   snp3   snp4
snp1    1     0.3   0.4    0.5
snp2    0.3     1   0.4    0.5
snp3    0.4   0.4     1    0.5
snp4    0.5   0.5   0.5      1

私はこれを変えたいファイル1入力するファイル2:

snp1 snp1   1
snp1 snp2   0.3 
snp1 snp3   0.4 
snp1 snp4   0.5
snp2 snp2   1 
snp2 snp3   0.4
snp2 snp4   0.5
snp3 snp3   1
snp3 snp4   0.5
snp4 snp4   1

私は理解できることを願っていますが、他のどの形式で質問するのかわかりません。私の実際のファイルでは、ファイルはfile1よりも大きいです。

ありがとうございます。

ベストアンサー1

目的の出力に応じて、上三角関数値のみを印刷します。

awk '
  NR==1 {
    split($0,hdr," "); next
  } 
  {
    for (i=NR;i<=NF;i++) {print $1 FS hdr[i] FS $i}
  }
' file
snp1 snp1 1
snp1 snp2 0.3
snp1 snp3 0.4
snp1 snp4 0.5
snp2 snp2 1
snp2 snp3 0.4
snp2 snp4 0.5
snp3 snp3 1
snp3 snp4 0.5
snp4 snp4 1

または等しくPerlを使用して

perl -alne '
  if ($. == 1) {
    @hdr = @F;
  } else {
    for $i ($.-1 .. $#F) {
      print join " ", $F[0], $hdr[$i], @F[$i];
    }
  }' file

上三角形だけでなく、行列全体が必要な場合は、ループの開始インデックスを変更して(awkバージョンから)を(perlバージョンから)forに置き換えます。NR2$.-11

おすすめ記事