R中的字符串删除

此前,我曾问过一个问题

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

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

解决方案:

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

给TA打赏
共{{data.count}}人
人已打赏
未分类

根据每一级的总和来填充一个变量。

2022-9-8 13:01:18

未分类

如何用jQuery检查div内的段落数并删除部分段落?

2022-9-8 13:01:20

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索