此前,我曾问过一个问题
的,我现在正试图实现一个更快的版本,但遇到了一个意想不到的问题。
我的尝试
library(ape)
codon.tbl <- "vertebrate mitochondrial"
pos1 <- c("a", "c", "g", "t")
pos2 <- c("a", "c", "g", "t")
pos3 <- c("a", "c", "g", "t")
codons <- expand.grid(pos1, pos2, pos3)
codons <- paste0(codons$Var1, codons$Var2, codons$Var3)
# Exclude stop codons
if (codon.tbl == "standard") {
stop.codons <- c("taa", "tag", "tga")
} else if (codon.tbl == "vertebrate mitochondrial") {
stop.codons <- c("aga", "agg", "taa", "tag")
} else {
# invertebrate mitochondrial
stop.codons <- c("taa", "tag")
}
codons <- codons[which(codons != stop.codons)] # problematic line
上面的代码行应该只包含60个元素,因为当codon.tbl =="vertebrate mitochondrial "时,有4个可能的停止密码子;相反,"codons "包含62个元素。
当我运行代码时,'codons'仍然包含 "agg "和 "taa "这两个字符串,只有 "ga "和 "tag "被删除。
我不知道为什么会出现这种情况
我们可以使用 %in%
和否定(!
)而不是 !=
因为'stop.codons' length
大于1和 ==
或 !=
构成比较
out <- codons[!codons %in% stop.codons]
any(c('agg', 'taa') %in% out)
#[1] FALSE
举个简单的例子
v1 <- 1:5
v2 <- 2:3
v1 == v2
#[1] FALSE FALSE FALSE FALSE FALSE
这里,'v1'的第一个元素即1与2比较,接下来与3比较,然后'v1'的第三个元素即3与2比较(回收较短的向量)。
而使用 %in%
它检查整个 vector
是否有该元素
v1 %in% v2
#[1] FALSE TRUE TRUE FALSE FALSE
或与 setdiff
如果没有重复
setdiff(codons, stop.codons)
或使用 vsetdiff
从 vecsets
library(vecsets)
vsetdiff(codons, stop.codons)