我正在尝试创建一个函数来计算“ a”,“ t”,“ g”和“ t”,“ a”,“ g”或“ t”,“ g”,“ a”或“ t”,“ a”之间的字符数向量中的“”。但是我的代码陷入了while循环中。例如x =“ a”“ a”“ a”“ t”“ a”“ t”“ g”“ t”“ c”“ g”“ t”“ t”“ t”“ t”“ a“” g。在此示例中,代码应在“ a”,“ t”,“ g”和“ t”,“ a”,“ g”之间计数6个字符。任何帮助将不胜感激:)。
orfs<-function(x,p){
count<-0
cntorfs<-0
n<-length(x)
v<-n-2
for (i in 1:v){
if(x[i]=="a"&& x[i+1]=="t"&& x[i+2]=="g"){
k<-i+3;
w<-x[k]
y<-x[k+1]
z<-x[k+2]
while (((w!="t")&&(y!="a")&& (z!="g"))||((w!="t")&&(y!="a")&&(z!="a"))||((w!="t")&&(y!="g")&& (z!="a"))||(i+2>v)){
count<-count+1
k<-k+1
w<-x[k]
y<-x[k+1]
z<-x[k+2]
}
}
if(count>p){
cntorfs<-cntorfs+1
}
if (count!=0){
count<-0
}
}
cat("orf:",cntorfs)
}
答案 0 :(得分:1)
这是一种非常效率低下且不像R的方式来计算两个模式之间的字符数。
这里是使用gsub
的替代方法,它可以帮助您入门,并且可以扩展为解决其他终止密码子的问题:
x <- c("a", "a", "a", "t", "a", "t", "g", "t", "c", "g", "t", "t", "t", "t", "a", "g")
nchar(gsub("[actg]*atg([actg]*)tag[actg]*", "\\1", paste0(x, collapse = "")))
#[1] 6
可以使用Biostrings::matchPattern
here找到更健壮和通用的方法。我强烈建议不要在这里重新发明轮子,而是建议使用为这些任务而开发的一些标准Bioconductor软件包。