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

使用GRanges对象上的坐标从FASTA文件中提取序列片段,r,bioinformatics,R,Bioinformatics,我需要提取枯草芽孢杆菌的基因间序列 我有R中枯草杆菌的完整DNA序列,与seqinr一起导入。 我使用seqinr包的函数read.fasta将dna序列导入R 然后,我从Bacillus subtilis genbank文件中创建了一个GRanges对象,使用包“genbankr”提取基因间坐标 这是我的GRanges对象与基因间坐标的格式: GRanges object with 3841 ranges and 1 metadata column: seqnames

我需要提取枯草芽孢杆菌的基因间序列

我有R中枯草杆菌的完整DNA序列,与seqinr一起导入。 我使用seqinr包的函数read.fasta将dna序列导入R

然后,我从Bacillus subtilis genbank文件中创建了一个GRanges对象,使用包“genbankr”提取基因间坐标

这是我的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
  ...      ...                ...    ... .                       ...
基本上是一条线,带有从my GRanges对象的intergenic_id name列中提取的基因间序列的名称,然后是使用GRanges中的坐标从fasta中提取的序列


注意:在所需的输出中,我只是键入了一些随机序列,就像示例一样。

我也认为这是最好的方法(您可以构建自己的),但您也可以使用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')
require('sekinr'))
需要('基因组范围')
#创建对象

mygenome使用
BSGenome::getSeq
检查此项,它可以将
BSGenome
对象和
GRanges
对象作为输入。我尝试了这种方法,但问题是我找不到可用于我的生物体的BSGenome对象。我有斋戒。该生物体是枯草芽孢杆菌菌株168。请尝试使用
Biostrings
中的
readDNAStringSet
函数读取fasta文件,在将
DNAStringSet
对象和
GRanges
对象一起传递到
getSeq
之前,我明天会尝试使用您的代码,但通过阅读,它似乎可以成为我的解决方案;我也已经有了seqinr和基因组范围的软件包。谢谢你的帮助。这非常有效,但是我意识到genbankr的基因间功能存在问题;我的基因间范围,正如你在我的帖子中看到的,都被归类为*,没有加号或减号。因此,使用这种方法,我只得到前向链序列。正在整理这件事;我尝试过其他的方法,比如从基因组特征中找出差距;但所有这些都有缺点。我不确定你想要实现什么,但基因间区域没有链是有意义的,因为它只是注释基因之间的区域。我想提取每个基因上游的基因间区域。例如,如果两个基因相互跟随,第一个基因在反向链上,第二个基因在正向链上。基因间区域由这两个基因共享。对于反向的第一个基因,基因间区域将是基因间区域的反向补充;对于前链上的第二个基因,它是基因间区域。我的方法只报告了一次,只是说它位于这两个基因之间。本质上,我想将基因间区域视为每个基因的上游区域。
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')