使用GRanges对象上的坐标从FASTA文件中提取序列片段

问题描述:

我需要提取枯草芽孢杆菌的基因间序列。使用GRanges对象上的坐标从FASTA文件中提取序列片段

我有枯草芽孢杆菌中的R,与seqinr进口的完整DNA序列。 我使用包seqinr的函数read.fasta将dna序列导入到R中;

我然后创建来自枯草芽孢杆菌基因库文件中使用包“genbankr”来提取基因间坐标的GRANGES对象。

这是我GRANGES的格式与基因间坐标对象:

GRanges object with 3841 ranges and 1 metadata column: 
    seqnames    ranges strand |    intergenic_id 
    <Rle>   <IRanges> <Rle> |    <character> 
    168  168  [ 1, 409]  * | intergenic_SEQ-BEGIN_dnaA 
    168  168  [1751, 1938]  * |  intergenic_dnaA_dnaN 
    168  168  [3076, 3205]  * |  intergenic_dnaN_yaaA 
    168  168  [3422, 3436]  * |  intergenic_yaaA_recF 
    168  168  [4550, 4566]  * |  intergenic_recF_yaaB 
    ...  ...    ... ... .      ... 

因此,在RI有: “×”(完整的DNA与seqinr进口序列)和“基因间”(即GRANGES与对象坐标)

我看到有人问类似的问题,在这个论坛上,我曾尝试用多种套餐遵循这些答案没有成功,但我无法弄清楚。我希望有一个简单的解决方案,任何帮助表示赞赏。

我的期望的输出将产生具有以下列格式的基因间序列的FASTA文件:

>intergenic_SEQ-BEGIN_dnaA 
ATATATATATTATTTATTTTTTTTTTTTATTATAT 
>intergenic_dnaA_dnaN 
ATATATCGCGTCGATCTAGACTCAGGCATG 
etc. 

基本上与我的GRANGES对象从intergenic_id名称列采取的基因间序列的名称的行接着是使用GRanges中的坐标从fasta中提取的序列。

注:在所希望的输出I刚刚输入一些随机序列,正如例子。

+0

检查这个[问题](https://开头*.com/questions/35132118/how-can-i-extract-sequences-from-a-fasta-file-for-each-of-the-intervals-defined)使用'BSGenome :: getSeq'可以采取输入一个'BSGenome'对象和一个'GRanges'对象。 – Lamia

+0

我试过这种方法,但问题是我无法找到可用于我的生物体的BSGenome对象。我有一个FASTA。生物体是枯草芽孢杆菌菌株168. – Diesel

+1

在将'DNAStringSet'对象与'GRanges'对象一起传递给'getSeq'之前,尝试使用'Biostrings'中的'readDNAStringSet'函数读取您的fasta文件。 – Lamia

我也觉得BSGenome这是最好的方式(你可以建立你BSgenome),但你也可以用seqinr做创建您自己的功能:

require('seqinr') 
require('GenomicRanges') 

# Create objects 
mygenome <- read.fasta('sequence.fasta')[[1]] # I assume it is just one chromosome 
mygrs <- GRanges(seqnames=rep('NC_000964',3), 
       ranges=IRanges(c(1,50,100),c(20,55,103)), 
        strand=c('*','*','*')) 
mcols(mygrs)$Gene <- c('GenA','GenB','GenC') 
mygrs 
# GRanges object with 3 ranges and 1 metadata column: 
# seqnames  ranges strand |  Gene 
# <Rle> <IRanges> <Rle> | <character> 
# [1] NC_000964 [ 1, 20]  * |  GenA 
# [2] NC_000964 [ 50, 55]  * |  GenB 

# Function to subset the seqinr list 
extractSeq <- function(x) { 
    if (as.character(strand(x)) == '-') { 
     comp(mygenome[end(x):start(x)]) 
    } else { 
     mygenome[start(x):end(x)] 
    } 
    }  

# Ex 
    extractSeq(mygrs[1]) 
    # [1] "a" "t" "c" "t" "t" "t" "t" "t" "c" "g" "g" "c" "t" "t" "t" "t" "t" "t" "t" "a"  

# Apply to all 
    myseqs <- lapply(mygrs, extractSeq) 

# write to a file 
    write.fasta(myseqs, mcols(mygrs)$Gene, 'myfile.fa') 
+0

明天我会尝试你的代码,但通过阅读它似乎可能是我的解决方案;我也已经有seqinr和基因组的范围。谢谢你的帮助。 – Diesel

+0

这个工作很好,但是我意识到genbankr的基因间功能存在问题;我的基因间距范围,正如你可以从我的帖子中看到的那样,都被归类为*,不加或减。因此使用这种方法我只能用正向链序列结束。努力整理这些;我尝试了其他方法,例如GenomicFeatures;但都有缺陷。 – Diesel

+0

我不确定你想达到什么,但它有道理,即基因间区域没有链,因为它只是注释基因之间的区域。 – Osdorp