我有以下问题:我想在 (chr1_gene) 中找到来自 GRanges (gr3) 的区间两侧的下一个 5 个基因,并生成一个数据帧,其中包含区间的 chr 开始结束(从 gr3 开始)和每个ensembl_transcript_id的 i 列,最终为 NA。
非常感谢您的建议!
df <- data.frame(chrom=c("chr1","chr1"), start=c(5087459, 9995206 ), end=c(5097899, 10015020 ))
gr3 <- as(df, "GRanges")
library(biomaRt)
ensembl = useEnsembl(biomart="ensembl", dataset="hsapiens_gene_ensembl")
chr1_genes <- getBM(attributes=c('ensembl_gene_id',
'ensembl_transcript_id','hgnc_symbol','chromosome_name','start_position','end_position'), filters =
'chromosome_name', values ="1", mart = ensembl)
head(chr1_gene)
ensembl_gene_id ensembl_transcript_id hgnc_symbol chromosome_name start_position end_position
1 ENSG00000231510 ENST00000443270 1 5086459 5090899
2 ENSG00000162444 ENST00000315901 RBP7 1 9997206 10016020
3 ENSG00000162444 ENST00000294435 RBP7 1 9997206 10016020
4 ENSG00000270171 ENST00000602640 1 7693124 7694844
5 ENSG00000225643 ENST00000412797 1 25581478 25590356
6 ENSG00000116497 ENST00000530710 S100PBP 1 32816767 32858879
目前我有这个基于 follow() 和 precede() 的函数,但它非常慢,我想知道是否有更有效的方法可以做到这一点。谢谢!
enh25gens <- function(gr, GR){
idxf.1 <- follow(gr, subject = GR)
fol.gene <- mcols(GR[idxf.1:(idxf.1+4)])$ensembl_gene_id
idxf.1 <- precede(gr, subject = GR)
pre.gene <- mcols(GR[idxf.1:(idxf.1+4)])$ensembl_gene_id
list.enh2gene <- unlist(c(as.data.frame(gr[1]), pre.gene,fol.gene ))
return(list.enh2gene)
}
do.call(rbind.data.frame, lapply(gr3, function(x) enh25gens((x),chr1_genes.GR)))