Как использовать l oop для разделения фаста на две колонки в R без использования каких-либо пакетов? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть файл fasta, который выглядит следующим образом, с другими заголовками и соответствующей последовательностью. Как мне написать код с «for l oop», который преобразует его в кадр данных, в котором имя ORF хранится в столбце 1, а соответствующая последовательность восходящего и нисходящего потоков хранится в столбце 2? (Используя R studio)

>YAL001C TFC3 SGDID:S000000001, Chr I from 152168-146596, reverse complement, Verified ORF, "Largest of six subunits of the RNA polymerase III transcription initiation factor complex (TFIIIC); part of the TauB domain of TFIIIC that binds DNA at the BoxB promoter sites of tRNA and similar genes; cooperates with Tfc6p in DNA binding"
ACTTGTAAATATATCTTTTATTTTCCGAGAGGAAAAAGTTTCAAAAAAAAAAAAAAAAAA
AGAAGAAAAATAACTTTCTCATGTAATAAAAGGTAACTAATGTAGACAAAAAAGTATACA
TTTAGCTTTTCTTTTTTTGATGATTTTTGAGTTTCATGTTACTAATCAGAACAATTAACG

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Я полагаюсь на stringr для манипуляций со строками, поэтому я использовал его, я не уверен, имел ли вы в виду отсутствие пакетов, как в пакетах, изменяющих fasta, но вот для l oop в соответствии с запросом.

library(stringr)

#read in fasta
fa <- readLines("./test.fa")

#initialize empty data frame
df <- data.frame()

for (line in fa) {
  if (startsWith(line, ">")) {
    lin <- str_extract(line, "(\".+)(\")")
    df[nrow(df)+1,c(1,2)] <- c(substr(lin, 2, nchar(lin)-1), str_extract(line, "[0-9]+-[0-9]+"))
  }
}
#change col names
colnames(df) <- c("ORF", "SEQloc")

Если вас интересуют только строки заголовков фаста, вы можете внести некоторые предварительные изменения в файл перед его загрузкой в ​​R с помощью:

grep "^>" test.fa > header_only_test.fa
0 голосов
/ 08 мая 2020

Попробуйте.

tmp <- scan("foo.fa",sep="\n",what="character")
tmp.paste <- paste(tmp,collapse="\t")
tmp.fa <- strsplit(tmp.paste,">")[[1]]
tmp.dt <- t(sapply(tmp.fa,function(x){
  x1 <- strsplit(x,"\t")[[1]]
  x1.head <- strsplit(x1[1]," ")[[1]][1]
  x1.fa <- paste(x1[-1],collapse="")
  x1.fa <- gsub("\t","",x1.fa)
  c(x1.head,x1.fa)
}))
colnames(tmp.dt) <- c("ORFID","Fasta")
...