如何编写一个循环以从输出中删除 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
}
这对我有用。
下面的代码模拟了一些系统发育树(这里是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
}
这对我有用。