如何将表中的原始计数转换为R或bash上的相对丰度百分比?

如何将表中的原始计数转换为R或bash上的相对丰度百分比?,r,R,我试图将下表(filename=furnity_table)中每个单元格的计数转换为相对丰度百分比,方法是将每列的计数总和除以100(第一列除外) Taxa Sample1 Sample2 Eukaryota;Alveolata;Apicomplexa 1000 500 Eukaryota;Alveolata;Dinophyceae 2000 500 Eukaryota;Alveolata;Unclassified Alveolata 500 1000 Eukaryot

我试图将下表(filename=furnity_table)中每个单元格的计数转换为相对丰度百分比,方法是将每列的计数总和除以100(第一列除外)

Taxa    Sample1    Sample2
Eukaryota;Alveolata;Apicomplexa 1000    500
Eukaryota;Alveolata;Dinophyceae 2000    500
Eukaryota;Alveolata;Unclassified Alveolata  500 1000
Eukaryota;Choanoflagellida;Acanthoecidae        500  1000
Eukaryota;Choanoflagellida;Codonosigidae        1000     2000
我希望有一个输出表,它的外观完全如下所示:

Taxa    Sample1    Sample2
Eukaryota;Alveolata;Apicomplexa 20  10
Eukaryota;Alveolata;Dinophyceae 40   10
Eukaryota;Alveolata;Unclassified Alveolata  10  20
Eukaryota;Choanoflagellida;Acanthoecidae        10  20
Eukaryota;Choanoflagellida;Codonosigidae        20     40
我是R新手,我尝试了下面的R代码,但没有给我预期的结果。如果有人能为我提供正确的R代码,或者bash上有其他简单的解决方案,我将不胜感激

df <- read.table("abundance_table", header= TRUE, sep = "\t")
sum= colSums(df[,-1])
norm = df[,-1] / sum*100

df以下是三种基本R解决方案:

#1.
df[-1] <-sweep(df[-1], 2, colSums(df[,-1]), `/`) * 100

#2.
df[-1] <- t(t(df[-1])/colSums(df[,-1])) * 100

#3.
df[-1] <- sapply(df[-1], prop.table) * 100

以下是3个基本的R解决方案:

#1.
df[-1] <-sweep(df[-1], 2, colSums(df[,-1]), `/`) * 100

#2.
df[-1] <- t(t(df[-1])/colSums(df[,-1])) * 100

#3.
df[-1] <- sapply(df[-1], prop.table) * 100

使用awk作为替代方案,处理文件两次:

awk 'NR==FNR { tot1+=$(NF-1);tot2+=$NF;next } NR!=FNR && FNR == 1 { print } NR!=FNR && FNR != 1 { for (i=1;i<NF-1;i++) { printf "%s ",$i } printf "%s %s\n",($(NF-1)/tot1)*100,($(NF)/tot2)*100 }' file file

awk'NR==FNR{tot1+=$(NF-1);tot2+=$NF;next}NR=FNR&&FNR==1{print}NR=FNR&&FNR!=1{for(i=1;i使用awk作为替代方案,处理文件两次:

awk 'NR==FNR { tot1+=$(NF-1);tot2+=$NF;next } NR!=FNR && FNR == 1 { print } NR!=FNR && FNR != 1 { for (i=1;i<NF-1;i++) { printf "%s ",$i } printf "%s %s\n",($(NF-1)/tot1)*100,($(NF)/tot2)*100 }' file file
awk'NR==FNR{tot1+=$(NF-1);tot2+=$NF;next}NR!=FNR&&FNR==1{print}NR!=FNR&&FNR!=1{for(i=1;i)