使用Apply功能加快嵌套for循环

时间:2019-04-28 20:36:22

标签: r apply bioinformatics bioconductor

我不太擅长使用Apply系列功能。

我想使用apply系列函数,而不是遵循9076 x 9076次迭代的嵌套循环类型,以提高计算速度。最小的可重复数据如下。请帮忙。

数据:

data = structure(list(C1 = structure(c(3L, 4L, 2L, 5L, 1L), .Label = c("GO:0001525", 
"GO:0001869", "GO:0002576", "GO:0003723", "GO:0005515"), class = "factor"), 
    C2 = structure(c(2L, 3L, 1L, 4L, 5L), .Label = c("GO:0002020", 
    "GO:0003674", "GO:0003727", "GO:0005515", "GO:0005829"), class = "factor"), 
    C3 = structure(c(3L, 1L, 2L, 1L, 4L), .Label = c("", "GO:0002020", 
    "GO:0005576", "GO:0005886"), class = "factor"), C4 = structure(c(1L, 
    1L, 2L, 3L, 4L), .Label = c("", "GO:0002576", "GO:0005737", 
    "GO:0008201"), class = "factor")), class = "data.frame", row.names = c("A1BG", 
"A1CF", "A2M", "AAGAB", "AAMP"))

代码:

if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("GO.db", version = "3.8")
BiocManager::install("GOSemSim", version = "3.8")
BiocManager::install("org.Hs.eg.db", version = "3.8")
BiocManager::install("annotate", version = "3.8")

install.packages("cluster")
install.packages("RUnit")

# download csbl.go_1.4.1.tar.gz from http://csbi.ltdk.helsinki.fi/csbl.go/

# R CMD INSTALL csbl.go_1.4.1.tar.gz

library(org.Hs.eg.db)
library(GO.db)
library(GOSemSim)


mat=matrix(,5,5)  %actual mat=matrix(,9076,9076)
hsGO <- godata('org.Hs.eg.db', ont="MF")

for (i in 1:5) %actual for(i in 1:9076)
{
for (j in 1:5) %actual for(j in 1:9076)
{
   a=as.matrix(data[i,1:ncol(data)])
   b=as.matrix(data[j,1:ncol(data)])
   a=a[a!=""]
   b=b[b!=""]
   mat[i,j]=mgoSim(a,b, semData=hsGO, measure="Wang", combine="BMA")
  }
  print(paste("ith Iteration: ",i))
}

在这里,我希望使用apply系列函数来执行mgoSim函数以加快计算速度,就像使用嵌套于循环中的9076 x 9076,我没有得到结果。

预先感谢...

1 个答案:

答案 0 :(得分:2)

我是GOSemSim的贡献者之一(我的贡献是加快内部代码流程)。

如果我了解您的代码,则想比较分子功能亚本体论中基因的功能。

您需要一个基因或GO项的向量进行比较,我还使用了1函数来比较基因,而不是自己进行GO项的比较。 (如果您想比较执行条款,也可以这样做

mgeneSim

我被生物之星偶然发现了这个问题,但是您可能会在support.bioconductor.orgbioinformatics.stackexchange.com中得到更好的问题。


如果要比较每一行的GO条款,可以执行以下操作:

genes <- rownames(data)
genes_entrez <- mapIds(org.Hs.eg.db, keys = genes, keytype = "SYMBOL", column = "ENTREZID")
m <- mgeneSim(g,  semData=hsGO, measure="Wang", combine="BMA")
colnames(m) <- rownames(data)
colnames(m) <- rownames(data)
       A1BG  A1CF   A2M AAGAB  AAMP
A1BG  1.000 0.477 0.477 0.477 0.383
A1CF  0.477 1.000 0.625 1.000 0.501
A2M   0.477 0.625 1.000 1.000 0.526
AAGAB 0.477 1.000 1.000 1.000 0.815
AAMP  0.383 0.501 0.526 0.815 1.000

然后,您可以迭代genes2go,并使用go_terms <- unique(unlist(data)) go_terms <- go_terms[go_terms != ""] go_sim <- mgoSim(as.character(go_terms), as.character(go_terms), semData=hsGO, measure="Wang", combine=NULL) genes2go <- apply(data, 1, function(x){x[x != ""]}) 比较行。