在数据处理过程中,有时候需要将数据框中的绝对值按照列转换为相对丰度矩阵,即每一列除以对应的列之和,其结果为每一列的和为1。可能会有以下解决方法。
df = matrix(seq(50),nrow = 10, byrow = T)
![](https://img.haomeiwen.com/i16550912/705a3973b2cb2f8a.png)
作如下尝试
- 简单粗暴,结果错误
res1 = df/colSums(df)
![](https://img.haomeiwen.com/i16550912/e095cf943bd935d4.png)
这里的问题实际上在执行的过程是,每一列的每个元素依次循环除以列和,如下所示
![](https://img.haomeiwen.com/i16550912/900b41283ed0d8d4.png)
- 两次转置
res2 = t(t(df)/colSums(df))
首先进行转置,然后,每一行分别除以对应的列和,再转置恢复为原来的格式
![](https://img.haomeiwen.com/i16550912/3110f80b68d7bb90.png)
- 将列和扩展为同原数据同维度的矩阵,对应列相除
res3 <- df/matrix(rep(colSums(df),nrow(df)), nrow = nrow(df), byrow = T)
![](https://img.haomeiwen.com/i16550912/5244702138845c5d.png)
- sweep
res4 <- sweep(df,2,colSums(df),`/`)
- scale
res5 = scale(df, center=FALSE, scale=colSums(df))
![](https://img.haomeiwen.com/i16550912/46040154c6285782.png)
![](https://img.haomeiwen.com/i16550912/c56d7d983f94ef81.png)
6.decostand
res6 = decstand(df, method="total",margin = 2)
对转换后的结果,对列求和
colSums(res2);colSums(res3);colSums(res4);colSums(res5)
![](https://img.haomeiwen.com/i16550912/867e9551a058dafe.png)
网友评论