将大矩阵的每个单元格除以其行的总和
Divide each each cell of large matrix by sum of its row
我有一个按物种划分的站点矩阵。尺寸为 375 x 360。每个值代表该站点样本中某个物种的频率。
我正在尝试将该矩阵从频率转换为每个站点的相对丰度。
我已经尝试了几种方法来实现这一点,唯一有效的方法是使用 for 循环。但是,这需要很长时间,或者根本无法完成。
是否有实现此目的的函数或矢量化方法?我将我的 for 循环作为我正在尝试做的事情的示例。
relative_abundance <- matrix(0, nrow= nrow(data_wide),
ncol=ncol(data), dimnames = dimnames(data))
i=0
j=0
for(i in 1:nrow(relative_abundance)){
for(j in 1:ncol(relative_abundance)){
species_freq <- data[i,j]
row_sum <- sum(data[i,])
relative_abundance[i,j] <- species_freq/row_sum
}
}
您可以使用 apply
执行此操作,但在这种情况下 scale
会使事情变得更加简单。假设您要将列除以它们的总和:
set.seed(0)
relative_abundance <- matrix(sample(1:10, 360*375, TRUE), nrow= 375)
freqs <- scale(relative_abundance, center = FALSE,
scale = colSums(relative_abundance))
矩阵太大,无法在此处输出,但它应该如下所示:
> head(freqs[, 1:5])
[,1] [,2] [,3] [,4] [,5]
[1,] 0.004409603 0.0014231499 0.003439803 0.004052685 0.0024026910
[2,] 0.001469868 0.0023719165 0.002457002 0.005065856 0.0004805382
[3,] 0.001959824 0.0018975332 0.004914005 0.001519757 0.0043248438
[4,] 0.002939735 0.0042694497 0.002948403 0.002532928 0.0009610764
[5,] 0.004899559 0.0009487666 0.000982801 0.001519757 0.0028832292
[6,] 0.001469868 0.0023719165 0.002457002 0.002026342 0.0009610764
以及健全性检查:
> head(colSums(freqs))
[1] 1 1 1 1 1 1
使用apply
:
freqs2 <- apply(relative_abundance, 2, function(i) i/sum(i))
它的优点是可以很容易地按行更改为 运行,但结果无论如何都会作为列连接,因此您必须转置它。
首先,您可以
relative_abundance[i,j] <- data[i,j]/sum(data[i,])
所以你不创建变量...
但要对其进行矢量化,我建议:使用 rowsum 函数(快速)计算行总和,然后您可以按列使用应用,并将每个列除以行总和:
relative_freq<-apply(data,2,function(x) data[,x]/rowsum(data))
使用一些简单的线性代数,我们可以更快地得出结果。简单地在左边乘以一个对角矩阵和你需要的比例因子,就像这样:
library(Matrix)
set.seed(0)
relative_abundance <- matrix(sample(1:10, 360*375, TRUE), nrow= 375)
Diagonal_Matrix <- diag(1/rowSums(relative_abundance))
然后我们从左边开始乘:
row_normalized_matrix <- Diagonal_Matrix %*% relative_abundance
如果你想按列归一化简单地做:
Diagonal_Matrix <- diag(1/colSums(relative_abundance))
然后从右边相乘。
你可以这样做
relative_abundance <- matrix(sample(1:10, 360*375, TRUE), nrow= 375)
datnorm <- relative_abundance/rowSums(relative_abundance)
如果 relative_abundance 是矩阵而不是 data.frame
,这会更快
我有一个按物种划分的站点矩阵。尺寸为 375 x 360。每个值代表该站点样本中某个物种的频率。
我正在尝试将该矩阵从频率转换为每个站点的相对丰度。
我已经尝试了几种方法来实现这一点,唯一有效的方法是使用 for 循环。但是,这需要很长时间,或者根本无法完成。
是否有实现此目的的函数或矢量化方法?我将我的 for 循环作为我正在尝试做的事情的示例。
relative_abundance <- matrix(0, nrow= nrow(data_wide),
ncol=ncol(data), dimnames = dimnames(data))
i=0
j=0
for(i in 1:nrow(relative_abundance)){
for(j in 1:ncol(relative_abundance)){
species_freq <- data[i,j]
row_sum <- sum(data[i,])
relative_abundance[i,j] <- species_freq/row_sum
}
}
您可以使用 apply
执行此操作,但在这种情况下 scale
会使事情变得更加简单。假设您要将列除以它们的总和:
set.seed(0)
relative_abundance <- matrix(sample(1:10, 360*375, TRUE), nrow= 375)
freqs <- scale(relative_abundance, center = FALSE,
scale = colSums(relative_abundance))
矩阵太大,无法在此处输出,但它应该如下所示:
> head(freqs[, 1:5])
[,1] [,2] [,3] [,4] [,5]
[1,] 0.004409603 0.0014231499 0.003439803 0.004052685 0.0024026910
[2,] 0.001469868 0.0023719165 0.002457002 0.005065856 0.0004805382
[3,] 0.001959824 0.0018975332 0.004914005 0.001519757 0.0043248438
[4,] 0.002939735 0.0042694497 0.002948403 0.002532928 0.0009610764
[5,] 0.004899559 0.0009487666 0.000982801 0.001519757 0.0028832292
[6,] 0.001469868 0.0023719165 0.002457002 0.002026342 0.0009610764
以及健全性检查:
> head(colSums(freqs))
[1] 1 1 1 1 1 1
使用apply
:
freqs2 <- apply(relative_abundance, 2, function(i) i/sum(i))
它的优点是可以很容易地按行更改为 运行,但结果无论如何都会作为列连接,因此您必须转置它。
首先,您可以
relative_abundance[i,j] <- data[i,j]/sum(data[i,])
所以你不创建变量...
但要对其进行矢量化,我建议:使用 rowsum 函数(快速)计算行总和,然后您可以按列使用应用,并将每个列除以行总和:
relative_freq<-apply(data,2,function(x) data[,x]/rowsum(data))
使用一些简单的线性代数,我们可以更快地得出结果。简单地在左边乘以一个对角矩阵和你需要的比例因子,就像这样:
library(Matrix)
set.seed(0)
relative_abundance <- matrix(sample(1:10, 360*375, TRUE), nrow= 375)
Diagonal_Matrix <- diag(1/rowSums(relative_abundance))
然后我们从左边开始乘:
row_normalized_matrix <- Diagonal_Matrix %*% relative_abundance
如果你想按列归一化简单地做:
Diagonal_Matrix <- diag(1/colSums(relative_abundance))
然后从右边相乘。
你可以这样做
relative_abundance <- matrix(sample(1:10, 360*375, TRUE), nrow= 375)
datnorm <- relative_abundance/rowSums(relative_abundance)
如果 relative_abundance 是矩阵而不是 data.frame
,这会更快