在我研究生一年级的时候,我用R语言分析转录组时遇到了一个问题,如何对样本按照文库进行标准化,假设我手头的数据如下
mdat <- matrix(c(1,2,3, 11,12,13), nrow = 2, ncol = 3)
mdat
[,1] [,2] [,3]
[1,] 1 3 12
[2,] 2 11 13
我当时用了一个错误的方法
depth <- colSums(mdat)
mdat / depth
虽然这个时候运行没有出错,但其实结果存在问题。因为R语言的自动补全和R语言按列操作的特性,实际上我得到的是
1 / 2 3 / 25 12 /14
2 /14 11 / 2 13 /25
当时我的解决方法是,对数据进行转置
t(t(mdat ) / colSums(mdat))
今天我在阅读scale
的函数说明和源代码时发现了一个新的函数sweep
, 能够按行按列调用函数以提供的值处理原始的数据
sweep(mdat, 2, depth, "/")
通过我对源代码的检查,发现sweep
本质上还是调用了转置函数aperm
,针对于数组转置,而t()
是针对于矩阵转置。因此使用sweep
不会有速度上的提升,只是代码更加简洁了。