0

下面的代码模拟了一些系统发育树(这里是 100)。但是由于偶然的灭绝事件,一些树是NULL。我需要验证那些 NULL 树,将它们从输出对象中删除,然后从剩余的树中选择 N 棵树中的 x。

library(phytools)
Trees<- pbtree(b=0.6, d=0.2, n=200, t=NULL, scale=NULL, nsim=100,      type="continuous", extant.only=TRUE)

假设上面的代码返回 3 个 NULL,我需要(假设)从 100-3=97 个树中选择 50 个。它可以是前 50 棵树或其他。我不确定循环是否可以为我做到这一点。

谢谢你的帮助!

4

2 回答 2

1

因为 R 将对象存储为向量,所以循环通常不是特别有效:“应用”系列函数通常工作得更快。

在这里你可以尝试:

null.trees <- sapply(Trees, is.null)
valid.trees <- Trees[!null.trees]
if (length(valid.trees) < 50) {  
  warning('Not enough trees!'!
} else {
   valid.trees[1:50]
}
于 2016-04-13T18:09:41.813 回答
0

是的,一个循环可以帮助你。我会这样做,以避免生成一堆你从不使用的多余树:

 ntrees <- 50
 trees <- list()
 for (i in 1:ntrees) {
    tree <- NULL
    while (is.null(tree)) {
        tree <- pbtree(b=0.6, d=0.2, n=200, t=NULL, scale=NULL, 
                nsim=1, type="continuous", extant.only=TRUE)
    }
    trees[i] <- tree
 }

这对我行得通。

于 2016-05-10T22:43:10.050 回答