我想使用BiomaRt
包查询数据库。我有loci
并且想要检索一些相关信息,比如说description
。
我第一次尝试使用lapply
,但对执行任务所需的时间感到惊讶。因此,我尝试了更基本for-loop
的并获得更快的结果。
这是预期的还是我的代码或我的理解有问题apply
?我阅读了其他有关*apply
vsfor-loop
性能的帖子(例如,这里),我知道不应该期望提高性能,但我不明白为什么这里的性能实际上较低。
这是一个可重现的例子。
1)加载库并选择数据库:
library("biomaRt")
athaliana <- useMart("plants_mart_14")
athaliana <- useDataset("athaliana_eg_gene",mart=athaliana)
2)查询数据库:
loci <- c("at1g01300", "at1g01800", "at1g01900", "at1g02335", "at1g02790",
"at1g03220", "at1g03230", "at1g04040", "at1g04110", "at1g05240"
)
我创建了一个函数用于lapply
:
foo <- function(loci) {
getBM("description","tair_locus",loci,athaliana)
}
当我在第一个元素上使用此功能时:
> system.time(foo(cwp_loci[1]))
utilisateur système écoulé
0.020 0.004 1.599
当我lapply
用来检索所有值的数据时:
> system.time(lapply(loci, foo))
utilisateur système écoulé
0.220 0.000 16.376
然后我创建了一个新函数,添加了一个for-loop
:
foo2 <- function(loci) {
for (i in loci) {
getBM("description","tair_locus",loci[i],athaliana)
}
}
这是结果:
> system.time(foo2(loci))
utilisateur système écoulé
0.204 0.004 10.919
当然,这将应用于 的大列表loci
,因此需要性能最佳的选项。我感谢你的帮助。
编辑根据@MartinMorgan 的推荐
简单地把向量loci
传给getBM就大大提高了查询效率。越简单越好。
> system.time(lapply(loci, foo))
utilisateur système écoulé
0.236 0.024 110.512
> system.time(foo2(loci))
utilisateur système écoulé
0.208 0.040 116.099
> system.time(foo(loci))
utilisateur système écoulé
0.028 0.000 6.193