大概对两个操作重复500万次:
1) 从一条300多万长的字符串中截取50个字符的长度:
c50=substr(chr.fas$seq[chr.fas$chr==chr],position+1,position+50)
2) 对截取的DNA序列进行反转互补,这是写的一个函数:
<br />
reverseAndComplement<-function(strseq,doReverse=T,doComplement=T) { <br />
if (doReverse) { <br />
strseq2='' <br />
for (i in seq(nchar(strseq),1)) { <br />
strseq2=paste(strseq2,substr(strseq,i,i),sep='') <br />
} <br />
strseq=strseq2 <br />
} <br />
if (doComplement) { <br />
for (i in 1:nchar(strseq)) { <br />
si=substr(strseq,i,i) <br />
if (si=='A' | si=='a') { <br />
si='T' <br />
} else if (si=='T' | si=='t' | si=='U' | si=='u') { <br />
si='A' <br />
} else if (si=='C' | si=='c') { <br />
si='G' <br />
} else if (si=='G' | si=='g') { <br />
si='C' <br />
} <br />
substr(strseq,i,i)=si <br />
} #for <br />
} <br />
return(strseq) <br />
} <br />
<br />
就这两个操作,大概有500万次的操作,发现在R里执行很慢,半天才搞定10万条. (机子是linux的,在集群上的,应该速度不慢的)
是我上面的代码写得不对,还是R本身对字符串处理就慢?
貌似用paste()或是substr()判断每个字符有点浪费,可我也找不到其它可以逐个比较的方式了.