相対的に豊富なテーブルを作成する方法は?

相対的に豊富なテーブルを作成する方法は?

相対的な存在比率表を作成しようとしましたが、いくつかの問題が発生しました。 1つの列が正常に完了しましたが、テーブル全体を変換するのが困難です。

  • テーブルは常に.tsv形式なので、タブで区切られます。
  • 行1には名前が含まれています。
  • 2行目からx行目まではデータを含みます。
  • 列 1 には行名が含まれます。
  • 最後の列(n)には分類が含まれているため、数値ではありません。
  • 2列から(n-1)列までは、相対存在比(つまり、その列の合計で割った値)に変換しなければならない実際の数値データが含まれています。

以下に簡単な表を示します。もちろん、カテゴリーフィールドは通常はるかに長いですが、ここでは短くしました。

#OTU ID SampleA SampleB SampleC Taxonomy
cddjfhj63vhjdsmr4j4ot   17  14  0   d__Bacteria; p__Proteobacteria;
FPLS01016108.2.1307 15  20  14  d__Bacteria; p__Proteobacteria;
JX225178.1.1277 0   0   0   d__Bacteria; p__Bacteroidota;
FJ439832.1.1432 12  0   0   d__Bacteria; p__Bacteroidota;

デフォルトでは、出力は次のようになります。

#OTU ID SampleA SampleB SampleC Taxonomy
cddjfhj63vhjdsmr4j4ot   0.386363636 0.411764706 0   d__Bacteria; p__Proteobacteria;
FPLS01016108.2.1307 0.340909091 0.588235294 1   d__Bacteria; p__Proteobacteria;
JX225178.1.1277 0   0   0   d__Bacteria; p__Bacteroidota; c__Bacteroidia;
FJ439832.1.1432 0.272727273 0   0   d__Bacteria; p__Bacteroidota;

次のコードが見つかりましたが、1つの列に対してのみ機能し、テーブルに名前のある一番上の行が含まれていない場合:

awk 'FNR==NR{s+=$2;next;} {printf "%s\t%s\n",$1,$2/s}' table.tsv table.tsv > table2.tsv

いくつかの「簡単な」コマンドを使用する方法、またはPythonを使用して相対プレゼンステーブルを生成する方法を使用して、Linuxで私のテーブルを処理する方法を知っていますか?

ありがとうございます!

答え1

awk 'BEGIN{ FS=OFS="\t"; CONVFMT="%.9f" }
   NR==FNR{ for(i=2; i<=4; i++) sum[i]+=$i; next }
   FNR>1  { $2/=sum[2]; $3/=sum[3]; $4/=sum[4] }1' infile infile

通常、開始/終了列を渡す必要があります。

awk -v strt=2 -v end=4 '
BEGIN  { FS=OFS="\t"; CONVFMT="%.9f" }
NR==FNR{ for(i=strt; i<=end; i++) sum[i]+=$i; next }
FNR>1  { for(i=strt; i<=end; i++) $i/=sum[i] }1' infile infile

詳しくはこちら畳み込みFMT;これは、有効数字9桁%.9f(デフォルト値%.6g)が必要な浮動小数点を使用しているためです。

関連情報