首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中字符串移除

R中字符串移除
EN

Stack Overflow用户
提问于 2020-04-24 01:50:33
回答 1查看 40关注 0票数 2

以前,我问过这个问题

Generating DNA codon combinations in R

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

我的尝试

代码语言:javascript
运行
复制
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“。

我不知道为什么会这样

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-24 01:52:00

我们可以使用%in%和negate (!)代替!=,因为'stop.codons‘length大于1,==!=作为元素比较。

代码语言:javascript
运行
复制
out <- codons[!codons %in% stop.codons] 
any(c('agg', 'taa') %in% out)
#[1] FALSE

作为一个简单的例子

代码语言:javascript
运行
复制
v1 <- 1:5
v2 <- 2:3
v1 == v2
#[1] FALSE FALSE FALSE FALSE FALSE

在这里,“v1”的第一个元素,即1与2,其次是3,然后是'v1‘的第三个元素,即3与2(较短向量的循环)。

同时,使用%in%检查整个vector是否存在该元素。

代码语言:javascript
运行
复制
v1 %in% v2
#[1] FALSE  TRUE  TRUE FALSE FALSE

如果没有副本,也可以使用setdiff

代码语言:javascript
运行
复制
setdiff(codons, stop.codons)

或者使用来自vecsetsvecsets

代码语言:javascript
运行
复制
library(vecsets)
vsetdiff(codons, stop.codons)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61399772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档