如何放置字符

时间:2011-08-02 08:58:47

标签: r

我有一个fasta格式文件,其中我必须保留那些长度小于100的节点。但是,我目前面临的问题是我能够分离节点但是无法放置字符每个节点在单独的变量中,其长度i然后可以检查并随后将必需的节点与较长的节点分开。 所以我的意思是我能够读取标题和单独的节点,但我如何将每个节点中的字符放在一个变量中。

这是我的数据样本

>NODE_1
GTTGGCCGAGCCCCAGGACGCGTGGTTGTTGAACCAGATCAGGTCCGGGCTCCACTGCAC
GTAGTCCTCGTTGGACAGCAGCGGGGCGTACGAGGCCAGCTTGACCACGTCGGCGTTGCG
CTCGAGCCGGTCATGAACGCGGCCTCGGCGAGGGCGTTCTTCCAGGCGTTGCCCTGGGAA

>NODE_2
CCTCCGGCGGCACCACGGTCGGCGAGGCCCTCAACATCCTGGAGCGCACCGACCTGTCCA
CCGCGGACAAGGCCGGTTACCTGCACCGCTACATCGAGGCCAGCCGCATCGCGTTCGCGG
ACCGCGGGCGCTGGGTCGGCGACCCCGCCTTCGAGGACGTAC

>NODE_3
CCTCCGGCGGCACCACGGTCGGCGAGGCCCTCAACATCCTGGAGCGCACCGACCTGTCCA
CCGCGGACAAGGCCGGTTACCTGCACCGCTACATCGAGGCCAGCCGCATCGCGTTCGCGG
ACCGCGGGCGCTGGGTCGGCGACCCCGCCTTCGAGGACGTACATCATTCCTTAATCTTCC

我的代码:

x <- readLines("1.fa", n = -1L, ok = TRUE, warn = TRUE)

for (i in 1:length(x)) {
    if (substr(x[i],1,1)=='>') {
        head <- c(head,x[i])
        q <- x[i+1] 
        if (q=!0) {
            contig <- c(contig,q)
            print(contig)       
            contig.length <- c(contig.length, nchar(q))
        } else {
            break
        }
    } else {
        z <- paste(z,x[i], sep=" ")
    }
}

3 个答案:

答案 0 :(得分:6)

您应该使用BioConductor。您实际上是在尝试将FASTA文件解析为某种列表。 Bioconductor有一个简单的函数read.fasta()就可以做到这一点,并返回一个可以获取长度的对象,依此类推。如果你使用序列,学习bioconductor绝对值得麻烦。

要在基础R中执行此操作,您需要使用列表,例如:

Split.Fasta <- function(x){
  out <- list()
  for(i in x){
    if(substr(i,1,1)==">") {

      name <- gsub(">","",i)
      out[[name]] <- character(0)

    } else if (grepl("\\w",i)){
      out[[name]] <- paste(out[[name]],gsub("\\W","",i),sep="")
    } 
  } 
  out
}

其中的作用如下:

zz <- textConnection(">NODE_1 
GTTGGCCGAGCCCCAGGACGCGTGGTTGTTGAACCAGATCAGGTCCGGGCTCCACTGCAC 
GTAGTCCTCGTTGGACAGCAGCGGGGCGTACGAGGCCAGCTTGACCACGTCGGCGTTGCG 
CTCGAGCCGGTCATGAACGCGGCCTCGGCGAGGGCGTTCTTCCAGGCGTTGCCCTGGGAA

>NODE_2 
CCTCCGGCGGCACCACGGTCGGCGAGGCCCTCAACATCCTGGAGCGCACCGACCTGTCCA 
CCGCGGACAAGGCCGGTTACCTGCACCGCTACATCGAGGCCAGCCGCATCGCGTTCGCGG 
ACCGCGGGCGCTGGGTCGGCGACCCCGCCTTCGAGGACGTAC

>NODE_3 
CCTCCGGCGGCACCACGGTCGGCGAGGCCCTCAACATCCTGGAGCGCACCGACCTGTCCA
CCGCGGACAAGGCCGGTTACCTGCACCGCTACATCGAGGCCAGCCGCATCGCGTTCGCGG
ACCGCGGGCGCTGGGTCGGCGACCCCGCCTTCGAGGACGTACATCATTCCTTAATCTTCC")

X <- readLines(zz,n=-1L,ok=TRUE,warn=TRUE)
close(zz)

Y <- Split.Fasta(X)
$`NODE_1 `
[1] "GTTGGCCGAGCCCCAGGACGCGTGGTTGTTGAACCAGATCA...

$`NODE_2 `
[1] "CCTCCGGCGGCACCACGGTCGGCGAGGCCCTCAACATCCTGGAGC...

$`NODE_3 `
[1] "CCTCCGGCGGCACCACGGTCGGCGAGGCCCTCAACATCCTGGAGCGCAC...

它返回一个列表,您可以稍后使用它来检查长度等等:

sapply(Y,nchar)
NODE_1  NODE_2  NODE_3  
    180     162     180

不过,学会使用BioConductor,你会为此感谢你。

答案 1 :(得分:4)

您可以安装seqinr package,它有很多分析序列数据的方法。

install.packages("seqinr")

接下来,请阅读您的fasta文件:

seqs <- read.fasta("myfile.fa")

然后,从列表中提取长度为&lt; 100:

seqs.small <- seqs[sapply(seqs, function(x) getLength(x) < 100)]

答案 2 :(得分:-1)

也许分配会有所帮助?

assign('NODE_1', 'GTTGG...')