我在R中有一个大型数据帧(大约180,000行数据(。在每一行中,都有一个标识符的标题(NAME
(,然后是 41 列,告诉我们NAME
是否包含带有"1"或"0"的特定术语。所以,例如,在data
NAME1
有gene1
、gene2
、gene3
等,像这样:
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
你真的只需要一半的矩阵(因为它是对称的(。这告诉您,例如,gene1
和gene4
在 1 行中同时发生,但gene3
和gene4
在 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)