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