「R基础」用sweep对矩阵按列计算

在我研究生一年级的时候,我用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不会有速度上的提升,只是代码更加简洁了。

你可能感兴趣的:(「R基础」用sweep对矩阵按列计算)