首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重叠基因组范围

重叠基因组范围
EN

Stack Overflow用户
提问于 2013-09-30 19:06:07
回答 1查看 10.7K关注 0票数 5

我有两份文件

编码,编码

代码语言:javascript
复制
X.pattern.name       chr       start    stop    strand  score   p.value q.value matched.sequence
1   V_CETS1P54_01   chr1    98769545    98769554    +   11.42280    8.89e-05    NA  TCAGGATGTA
2   V_CETS1P54_01   chr1    152013037   152013046   +   11.98020    4.74e-05    NA  ACAGGAAGTT
3   V_CETS1P54_01   chr1    168932563   168932572   +   11.60860    7.59e-05    NA  ACCGGATGCT

encode.total

代码语言:javascript
复制
    chr     start           stop
1   chr1    58708485    58708713
2   chr1    58709084    58710538
3   chr1    98766295    98766639
4   chr1    98766902    98770338
5   chr1    107885506   107889414
6   chr1    138589531   138590856
7   chr1    138591180   138593378
8   chr1    152011746   152013185
9   chr1    152014263   152014695
10  chr1    168930561   168933076
11  chr1    181808064   181808906
12  chr1    184609002   184611519
13  chr1    193288453   193289567
14  chr1    193290105   193290490
15  chr1    193290744   193291092
16  chr1    196801920   196804954

我想比较这两个文件,每个条目由chrstartstop完成。如果第一个文件中的开始值和停止值位于同一染色体的第二个文件的开始和停止之间,那么第一个文件中的开始和停止值应该被第二个文件的开始和停止值替换。为此,我编写了一个for循环,但花费的时间太长了。有什么可供选择的?

代码:

代码语言:javascript
复制
for(i in 1:nrow(encode))
{
     for(j in 1:nrow(encode.total))
     {
           if(encode[i,2]==encode.total[j,1])
           {
               if((encode[i,3]>=encode.total[j,2]) & (encode[i,4]<=encode.total[j,3]))
               {
                   encode[i,3]=encode.total[j,2]
                   encode[i,4]=encode.total[j,3]
               }
           }
     }
}

出于同样的目的,我还尝试了如下所示的GenomicRanges包。我的dataframes的大小很大,它们上的合并函数创建了一个非常大的dataframe (超过20亿行,这是不允许的),尽管我最终将dataframe子集在一个较小的数据中。但是merge()占用了大量内存并终止了R。

代码语言:javascript
复制
gr1<-GRanges(seqnames=encode$chr,IRanges(start=encode$start,end=encode$end))
gr2<-GRanges(seqnames=encode.total$chr, IRanges(start=encode.total$start,end=encode.total$end))

ranges <- merge(as.data.frame(gr1),as.data.frame(gr2),by="seqnames",suffixes=c("A","B"))
ranges <- ranges[with(ranges, startB <= startA & endB >= endA),]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-01 01:29:22

使用生物导体 GenomicRanges包。

代码语言:javascript
复制
source("http://bioconductor.org/biocLite.R")
biocLite("GenomicRanges")

假设有两个数据帧x0x1,如原始示例中的encodeencode.total。我们希望将它们变成一个GRanges实例。我做这个的时候

代码语言:javascript
复制
library(GenomicRanges)
gr0 = with(x0, GRanges(chr, IRanges(start=start, end=stop)))
gr1 = with(x1, GRanges(chr, IRanges(start=start, end=stop)))

通常可以简单地说makeGRangesFromDataFrame(x0),或者使用标准的R命令“手动”创建一个GRanges实例。这里我们使用with(),这样就可以编写GRanges(chr, IRanges(start=start, end=stop))而不是GRanges(x0$chr, IRanges(start=x0$start, end=x0$stop))

下一步是查找查询(gr0)和主题(gr1)之间的重叠。

代码语言:javascript
复制
hits = findOverlaps(gr0, gr1)

这导致了

代码语言:javascript
复制
> hits
Hits of length 3
queryLength: 3
subjectLength: 16
  queryHits subjectHits 
   <integer>   <integer> 
 1         1           4 
 2         2           8 
 3         3          10 

然后更新相关的开始/结束坐标。

代码语言:javascript
复制
ranges(gr0)[queryHits(hits)] = ranges(gr1)[subjectHits(hits)]

给予

代码语言:javascript
复制
> gr0
GRanges with 3 ranges and 0 metadata columns:
      seqnames                 ranges strand
         <Rle>              <IRanges>  <Rle>
  [1]     chr1 [ 98766902,  98770338]      *
  [2]     chr1 [152011746, 152013185]      *
  [3]     chr1 [168930561, 168933076]      *
  ---
  seqlengths:
   chr1
     NA

这将很快达到数百万的范围。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19101849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档