Как поставить персонажей - PullRequest
       3

Как поставить персонажей

2 голосов
/ 02 августа 2011

У меня есть файл в формате 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=" ")
    }
}

Ответы [ 3 ]

6 голосов
/ 02 августа 2011

Вы должны использовать 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, вы будете благодарны за это.

4 голосов
/ 02 августа 2011

Вы можете установить пакет seqinr , который имеет множество методов для анализа данных последовательности.

install.packages("seqinr")

Далее, прочитайте в вашем файле fasta:

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

А затем извлекайте последовательности из списка длиной <100: </p>

seqs.small <- seqs[sapply(seqs, function(x) getLength(x) < 100)]
0 голосов
/ 02 августа 2011

Может быть, назначение будет полезно?

assign('NODE_1', 'GTTGG...')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...