首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用apply函数加速嵌套的for循环

使用apply函数加速嵌套的for循环
EN

Stack Overflow用户
提问于 2019-04-29 04:36:22
回答 1查看 119关注 0票数 0

我不擅长使用apply系列函数。

为了提高计算速度,我希望使用apply系列函数,而不是迭代9076 x 9076次的嵌套循环类型。下面给出了可重现的最小数据。请帮帮忙。

数据:

代码语言:javascript
运行
复制
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"))

代码:

代码语言:javascript
运行
复制
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嵌套的for循环,我得不到结果。

先谢谢你...

EN

回答 1

Stack Overflow用户

发布于 2019-04-29 16:03:34

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

如果我理解你的代码,你想在分子功能子本体中比较你的基因的功能。

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

代码语言:javascript
运行
复制
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

我是在biostars网站上偶然遇到这个问题的,但你可能会在support.bioconductor.orgbioinformatics.stackexchange.com中得到更好的答案。

如果你想比较每一行的GO术语,你可以这样做:

代码语言:javascript
运行
复制
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 != ""]})

然后,您可以迭代到genes2go并使用combineScore比较这些行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55894368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档