写在前面
现在是20年2月中旬了,今年注定是不平凡的一年,尽然现在都还在家中。但是任务量还是十分繁重。谁让做生物信息的也不用限制什么地点。
为什么我要实现抽平算法呢?16年phyloseq的出现很对我的胃口,因为扩增子数据本身较小,自R语言中的操作也是基本没障碍,本以为phyloseq中实现了抽平的方法,我没有查看源码,直接采用了,但是最近再做一些项目中发现这个抽平方法是有问题的:
library(tidyverse)
ps = readRDS("../ps_liu.rds")
total = min(sample_sums(ps));total
standf = function(x,t = total)(t*(x/sum(x)))
ps11 = transform_sample_counts(ps,standf);ps11
sample_sums(ps11)
简单看一下似乎结果没设么问题?但是当我想想这种抽平写法,却实在想不通这是怎么抽平的。
KO1 KO2 KO3 KO4 KO5 KO6 OE1 OE2 OE3 OE4 OE5 OE6 WT1 WT2 WT3 WT4 WT5 WT6
32049 32049 32049 32049 32049 32049 32049 32049 32049 32049 32049 32049 32049 32049 32049 32049 32049 32049
于是我打开了源代码;从这里我们就发现,这并不是抽平,只是标准化而已。这也很好的解释了standf = function(x,t = total)(t*(x/sum(x)))这行代码的意义。这只是一中标准化方式,意味着如果序列数量较少,按照所谓phyloseq抽平的方式得到的结果不是整数。
function (physeq, fun, ...)
{
if (!identical(length(fun(1:10)), 10L)) {
stop("`fun` not valid function.")
}
if (taxa_are_