gpt4 book ai didi

r - 将大矩阵的每个单元格除以其行的总和

转载 作者:行者123 更新时间:2023-12-04 10:57:23 25 4
gpt4 key购买 nike

我有一个按物种矩阵排列的网站。尺寸为 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))

这具有易于更改为按行运行的优点,但无论如何结果将作为列连接,因此您必须转置它。

关于r - 将大矩阵的每个单元格除以其行的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35691205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com