使用GRanges对象上的坐标从FASTA文件中提取序列片段
我需要提取枯草芽孢杆菌的基因间序列 我有R中枯草杆菌的完整DNA序列,与seqinr一起导入。 我使用seqinr包的函数read.fasta将dna序列导入R 然后,我从Bacillus subtilis genbank文件中创建了一个GRanges对象,使用包“genbankr”提取基因间坐标 这是我的GRanges对象与基因间坐标的格式:使用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
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')