【问题标题】:How do I speed up this for loop?如何加快这个 for 循环?
【发布时间】:2020-12-15 09:07:31
【问题描述】:

我无法加快我根据 Maxwell 等人 (2018) 论文修改的以下代码。 https://www.pnas.org/content/115/19/4891.short

ttrees.cal3.trees <- list()
n <- 1000
for (i in 1:n){
ttrees.cal3.trees[[i]] <- rtree(10)
ttrees.cal3.trees[[i]]$edge.length <- rep(0, 11)
while (min(ttrees.cal3.trees[[i]]$edge.length) == 0) {
  ttrees.cal3.trees[[i]] <- cal3TimePaleoPhy(tree = tree3, timeData 

= ranges, brRate = 1.775051,
    extRate = 1.775051, sampRate = 0.023, ntrees = 1, root.max = 1)
    }
    
}


,FAD,LAD
H_neanderthalenis,0.25,0.04
H_heidelbergensis,0.6,0.1
H_sapiens,0.335,0
H_antecessor,1,0.396
H_naledi_195,0.335,0.236
Asian_H_erectus_153,1.9,0.03
African_H_erectus_DAN5_P1,1.6,1.5
African_H_erectus,1.9,0.03
Georgian_H_erectus,1.8,1.7
H_rudolfensis_97,2.4,1.6
H_habilis_106,2.4,1.8
Au_sediba_93,1.98,1.97
H_floresiensis_LB1,0.74,0.17
Au_africanus_59,3,2.4
P_aethiopicus_67,2.5,2.3
P_bosei_77,2.3,1.4
P_robustus_89,2,1.5
K_platyops,3.54,3
Au_ghari_63,2.5,2.45
Au_afarensis,3.7,3
Au_afarensis_36,3.7,3
Au_afarensis_37,3.7,3
Au_afarensis_38,3.7,3
Au_anamensis,4.2,3.9
Ar_ramidus,4.5,4.3
S_tchadensis,7,7
P_troglodytes_4,7.3,0
P_troglodytes_5,7.3,0
P_troglodytes_6,7.3,0
G_gorilla,8,0


#NEXUS


BEGIN TREES;
    TRANSLATE
[0]     1   'H_neanderthalenis',
[1]     2   'H_heidelbergensis',
[2]     3   'H_sapiens',
[3]     4   'H_antecessor',
[4]     5   'H_naledi_195',
[5]     6   'Asian_H_erectus_153',
[6]     7   'African_H_erectus_DAN5_P1',
[7]     8   'African_H_erectus',
[8]     9   'Georgian_H_erectus',
[9]     10  'H_rudolfensis_97',
[10]    11  'H_habilis_106',
[11]    12  'Au_sediba_93',
[12]    13  'H_floresiensis_LB1',
[13]    14  'Au_africanus_59',
[14]    15  'P_aethiopicus_67',
[15]    16  'P_robustus_89',
[16]    17  'P_bosei_77',
[17]    18  'K_platyops',
[18]    19  'Au_ghari_63',
[19]    20  'Au_afarensis',
[20]    21  'Au_afarensis_36',
[21]    22  'Au_afarensis_37',
[22]    23  'Au_afarensis_38',
[23]    24  'Au_anamensis',
[24]    25  'Ar_ramidus',
[25]    26  'S_tchadensis',
[26]    27  'P_troglodytes_4',
[27]    28  'P_troglodytes_5',
[28]    29  'P_troglodytes_6',
[29]    30  'G_gorilla'
    ;

  

树 = ((((((((((((((((((1,2),(3)),4),5),(13,6)),7,8), 9),10),(11,12)),(14,(15,(17,16)))), 18),(19,(22,21,23,20))),24),25),26),(28,29,27)),30);

END;


tree3<-read.nexus("third-app.nex")
ranges<-read.csv("time.csv", header=T, row.names=1)
ranges <- as.data.frame(ranges, row.names = row.names(ranges))

我不确定如何更改方法以使用 apply 系列使代码正常工作。任何帮助将不胜感激。

【问题讨论】:

    标签: r for-loop while-loop tree phylogeny


    【解决方案1】:

    您可以将代码重写为lapply,如下所示:

    ttrees.cal3.trees <- lapply(seq(1000), function(i) {
      tmp <- rtree(10)
      tmp$edge.length <- rep(0, 11)
      while (min(tmp$edge.length) == 0) {
        tmp <- cal3TimePaleoPhy(tree = tree3, 
                                timeData = ranges, 
                                brRate = 1.775051,
                                extRate = 1.775051, 
                                sampRate = 0.023, 
                                ntrees = 1, 
                                root.max = 1)
      }
      return(tmp)
    })
    

    但是,我怀疑这会大大加快计算速度。它不是遍历作为资源瓶颈的列表,而是重复调用cal3TimePaleoPhy,直到绘制没有零长度边的随机样本。如果没有您正在使用的数据,就无法测试可能实现这一目标的其他方式。

    【讨论】:

    • 嗨,艾伦,我已经复制了该数据以及我用来读取它的方法。
    猜你喜欢
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多