如何编写一个循环以从输出中删除 NULL 并将其缩小到所需的长度?

How to write a loop to remove the NULLs from output and shrink it to a desirable length?

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

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

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

感谢您的帮助!

因为 R 将对象存储为向量,所以循环通常不是特别有效:'apply' 系列函数通常运行得更快。

这里你可以试试:

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]
}

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

 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
 }

这对我有用。