以前,我问过这个问题
Generating DNA codon combinations in R
其中,我正在尝试实现一个更快的版本,但却遇到了一个意想不到的问题。
我的尝试
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 ==“脊椎动物线粒体”时,有4个可能的终止密码子,相反,'codons‘包含62个元素。
当我运行代码时,'codons‘仍然包含字符串"agg“和"taa";只删除了"aga”和"tag“。
我不知道为什么会这样
发布于 2020-04-24 01:52:00
我们可以使用%in%
和negate (!
)代替!=
,因为'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)
或者使用来自vecsets
的vecsets
library(vecsets)
vsetdiff(codons, stop.codons)
https://stackoverflow.com/questions/61399772
复制相似问题