Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将大矩阵的每个单元格除以其行的和_R_Matrix_Probability_Frequency - Fatal编程技术网

R 将大矩阵的每个单元格除以其行的和

R 将大矩阵的每个单元格除以其行的和,r,matrix,probability,frequency,R,Matrix,Probability,Frequency,我有一个网站的物种矩阵。尺寸为375 x 360。每个值表示该场地样本中物种的频率 我试图将这个矩阵从频率转换为每个地点的相对丰度 我尝试了几种方法来实现这一点,唯一有效的方法是使用for循环。然而,这需要相当长的时间,或者根本无法完成 是否有一种功能或矢量化方法来实现这一点?我已经包括了我的for循环,作为我正在尝试做的一个例子 relative_abundance <- matrix(0, nrow= nrow(data_wide), ncol=ncol(data), dimnames

我有一个网站的物种矩阵。尺寸为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(colSums(freqs))
[1] 1 1 1 1 1 1
使用
应用

freqs2 <- apply(relative_abundance, 2, function(i) i/sum(i))

freqs2首先,你可以

relative_abundance[i,j] <- data[i,j]/sum(data[i,])

相对丰度[i,j]使用一些简单的线性代数,我们可以得到更快的结果。只需在左侧乘以一个对角线矩阵和所需的比例因子,如下所示:

library(Matrix)
set.seed(0)
relative_abundance <- matrix(sample(1:10, 360*375, TRUE), nrow= 375)
Diagonal_Matrix <- diag(1/rowSums(relative_abundance))
库(矩阵)
种子集(0)

相对丰度你可以这样做

relative_abundance <- matrix(sample(1:10, 360*375, TRUE), nrow= 375)
datnorm <- relative_abundance/rowSums(relative_abundance) 

相对丰度相对丰度/rowSums(相对丰度)?
相对丰度这就像一个符咒,但我不明白如何
apply()
知道如何将每个单元格“
I
”除以行的总和。因为在我的逻辑中,
i
引用一个单元格,因此,
sum(i)
将返回单元格的和,而不是行的和。@Zane.Lazare
apply
对行或列起作用,这取决于第二个参数,我将其设置为
2
,因此对列起作用
i
表示一列,因此整个列将被它的和除,并返回一个向量
apply
自动将列绑定在一起,因此您可以得到一个矩阵作为输出。
sweep
通常是这方面的标准
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)