R中的字符串删除

问题描述 投票:0回答:1

此前,我曾问过一个问题

在R中生成DNA密码子组合。

的,我现在正试图实现一个更快的版本,但遇到了一个意想不到的问题。

我的尝试

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 "被删除。

我不知道为什么会出现这种情况

r string
1个回答
0
投票

我们可以使用 %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)

或使用 vsetdiffvecsets

library(vecsets)
vsetdiff(codons, stop.codons)
© www.soinside.com 2019 - 2024. All rights reserved.