r语言 - 我需要找出 37 个术语之间的重叠



我在R中有一个大型数据帧(大约180,000行数据(。在每一行中,都有一个标识符的标题(NAME(,然后是 41 列,告诉我们NAME是否包含带有"1"或"0"的特定术语。所以,例如,在dataNAME1gene1gene2gene3等,像这样:

gene1  gene2 gene3
NAME1 1      0     1
NAME2 0      1     1

这段代码中有41个潜在的基因,我想产生描述性的统计数据来解释重叠的位置。那么,例如,有多少个NAMES在基因1和基因2之间有重叠,有多少同时有基因2和基因3?我不需要知道它们是什么名字。理想情况下,这将扩展到3个或更多基因的组合,但这个子集非常小,所以它实际上不是必需的。如果我能得到所有双基因组合出现的次数的统计数据,那就足以完成这项任务了。

我真的被这个问题困住了,不知道该怎么做。有什么想法吗?提前感谢您的帮助!

使用矩阵乘法:

m = matrix(c(1, 0, 0, 1, 1, 1, 1, 1), ncol = 4)
colnames(m) = paste0("gene", 1:4)
m
#      gene1 gene2 gene3 gene4
# [1,]     1     0     1     1
# [2,]     0     1     1     1

t(m) %*% m
#       gene1 gene2 gene3 gene4
# gene1     1     0     1     1
# gene2     0     1     1     1
# gene3     1     1     2     2
# gene4     1     1     2     2

你真的只需要一半的矩阵(因为它是对称的(。这告诉您,例如,gene1gene4在 1 行中同时发生,但gene3gene4在 2 行中同时发生。

> 一个选项是crossprod

crossprod(m, m)

数据

m <- structure(c(1, 0, 0, 1, 1, 1, 1, 1), .Dim = c(2L, 4L), .Dimnames = list(
NULL, c("gene1", "gene2", "gene3", "gene4")))

正如我假设gene1在所有情况下都与您可能想要的gene1重叠:

crossprod(m, m) + crossprod(1-m, 1-m)

最新更新