【发布时间】:2017-11-09 18:18:17
【问题描述】:
我有以下格式的两个输入:
domains = list(
O60925 = "PF01920",
P01130 = c("PF07645", "PF00057", "PF00058"),
Q14764 = c("PF11978", "PF01505"),
Q9BX68 = "PF01230",
P46777 = "PF14204")
interactions = structure(c(1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0), .Dim = c(8L, 8L), .Dimnames = list(c("PF01920",
"PF07645", "PF00057", "PF00058", "PF11978", "PF01505", "PF01230",
"PF14204"), c("PF01920", "PF07645", "PF00057", "PF00058", "PF11978",
"PF01505", "PF01230", "PF14204")))
PF01920 PF07645 PF00057 PF00058 PF11978 PF01505 PF01230 PF14204
PF01920 1 0 0 0 0 0 1 0
PF07645 0 1 0 1 0 0 0 0
PF00057 0 0 1 1 0 0 0 0
PF00058 0 1 1 1 0 0 0 0
PF11978 0 0 0 0 1 0 0 0
PF01505 0 0 0 0 0 1 0 0
PF01230 1 0 0 0 0 0 1 0
PF14204 0 0 0 0 0 0 0 0
我想计算以下输出,其中每个单元格中的整数表示interactions 矩阵中所有单元格的总和,用于domains 列表中的每对名称。
O60925 P01130 Q14764 Q9BX68 P46777
O60925 1 0 0 1 0
P01130 0 7 0 0 0
Q14764 0 0 2 0 0
Q9BX68 1 0 0 1 0
P46777 0 0 0 0 0
上下文是我有一个蛋白质列表(domains 列表的名称)及其 Pfam 域(domains 列表中的条目),以及一个已知 Pfam 域-Pfam 域相互作用的矩阵( interactions 矩阵)。我想总结每个蛋白质对的已知域-域相互作用的总数。
实际上domains 列表和interactions 矩阵都比这些大得多,所以我想确定一种快速生成此结果矩阵的方法。但是,到目前为止,我能想到的唯一解决方案是 apply 循环:
proteins = names(domains)
result = matrix(0, nrow = length(proteins), ncol = length(proteins),
dimnames = list(proteins, proteins))
combinations = tidyr::crossing(proteins, proteins)
n_interactions = apply(combinations, 1, function(row) {
domains1 = domains[[row[1]]]
domains2 = domains[[row[2]]]
sum(interactions[as.matrix(crossing(domains1, domains2))])
})
result[as.matrix(combinations)] = n_interactions
我确信一定有更快的方法来做到这一点,但是如何呢?
【问题讨论】:
-
您的预期输出与输入不匹配
标签: r optimization combinations apply