gpt4 book ai didi

r - 作为双向矩阵的所有成对行积的总和

转载 作者:行者123 更新时间:2023-12-01 08:27:18 25 4
gpt4 key购买 nike

我正在查看一些高通量基因数据并基于贝叶斯统计进行一种类型的相关分析。我需要做的一件事是找到数据集中产品的每个成对组合,并找到每个结果行的总和。

例如,对于高吞吐量数据集矩阵 Dataset

(Dataset <- structure(list(`Condition 1` = c(1L, 3L, 2L, 2L), `Condition 2` = c(2L, 1L, 7L, 2L), `Condition 3` = c(4L, 1L, 2L, 5L)), .Names = c("Condition 1", "Condition 2", "Condition 3"), class = "data.frame", row.names = c("Gene A", "Gene B", "Gene C", "Gene D")))
Condition 1 Condition 2 Condition 3
Gene A 1 2 4
Gene B 3 1 1
Gene C 2 7 2
Gene D 2 2 5

首先,我想将每对可能的行相乘以获得以下矩阵 Comb :
              Condition 1 Condition 2 Condition 3
Gene A Gene A 1 4 9
Gene A Gene B 3 2 4
Gene A Gene C 2 14 8
Gene A Gene D 2 4 20
Gene B Gene B 9 1 1
Gene B Gene C 6 7 2
Gene B Gene D 6 2 5
Gene C Gene C 4 49 4
Gene C Gene D 4 14 10
Gene D Gene D 4 4 25

在我想找到每个产品的行总和并以矩阵的形式获得总和之后(我将其称为 CombSums ):
            Gene A       Gene B      Gene C      Gene D 
Gene A NA 10 24 26
Gene B 10 NA 15 13
Gene C 24 15 NA 28
Gene D 26 13 28 NA

当我尝试这样做时,我能想到的最好的方法是
combs <- combn(seq_len(nrow(Dataset)), 2)
Comb <- Dataset[combs[1,], ] * Dataset[combs[2,], ]
rownames(Comb) <- apply(combn(rownames(Comb), 2), 2, paste, collapse = " ")
CombSums <- rowSums(Comb)

这会给我一个列表的总和,如下所示:
                    [1,]
Gene A Gene B 10
Gene A Gene C 24
Gene A Gene D 26
Gene B Gene C 15
Gene B Gene D 13
Gene C Gene D 28

不幸的是,我希望它是一个双向矩阵而不是一个列表,所以这不太有效,所以如果有人能提出一种将总和作为矩阵的方法,那将是一个很大的帮助。

最佳答案

使用 combn ,您可以避免进行冗余计算:

mat   <- as.matrix(DF)

pairs <- combn(1:nrow(DF),2)

vals <- rowSums(mat[pairs[1,],]*mat[pairs[2,],])
res <- matrix(,nrow(DF),nrow(DF),dimnames=list(rownames(DF),rownames(DF)))
res[lower.tri(res)] <- vals

# GeneA GeneB GeneC GeneD
# GeneA NA NA NA NA
# GeneB 9 NA NA NA
# GeneC 24 15 NA NA
# GeneD 26 13 28 NA

您的 Comb矩阵是中间结果 mat[pairs[1,],]*mat[pairs[2,],] .

整个计算可以在 combn里面完成,交替:
vals <- combn(rownames(DF),2,FUN=function(x)sum(apply(DF[x,],2,prod)))

正如@josilber 在下面的评论中指出的那样,这非常慢,但是。

数据:
DF <- read.table(header=TRUE,text="Condition1 Condition2   Condition3
GeneA 1 2 4
GeneB 3 1 1
GeneC 2 7 2
GeneD 2 2 5")

关于r - 作为双向矩阵的所有成对行积的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30949695/

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