如何创建相对丰度表?

如何创建相对丰度表?

我正在尝试创建一个相对丰度表,但遇到了一些问题。我成功地完成了一列,但正在努力改造整个表格。

  • 这些表始终为 .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;

我找到了下面的代码,但它仅适用于一列,并且如果表不包含带有名称的顶行:

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)。

相关内容