我有一个fasta格式文件,在其中我只需要保留长度小于100的那些节点。但是,我当前面临的问题是我能够分离节点,但不能放置每个节点的字符在一个单独的变量中,我可以检查其长度,然后将所需的节点与较长的节点分离。
因此,我的意思是我能够读取标题和单独的节点,但是如何将每个节点内的字符放入变量中。

这是我的数据样本

>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=" ")
    }
}

最佳答案

您应该使用BioConductor。您实际上是在尝试将FASTA文件解析为某种列表。 Bioconductor具有一个简单的功能read.fasta(),它可以执行此操作,并返回一个对象,您可以在其中获取长度等。如果您要处理序列,那么学习生物导体无疑是值得的。

要在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,您将为此感到感谢。

关于r - 如何放置角色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6909548/

10-12 17:45