我有两个文件
编码
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
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
我想比较两个文件,每个条目由 chr ,开始和停止。如果第一个文件中的开始和停止值落在同一染色体的第二个文件的开始和结束之间,那么该开始和结束。第一个文件中的停止值应该被第二个文件的start&停止价值观。我已经为此目的写了一个for循环但是花了太长时间。有哪些替代方案?
代码:
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软件包。我的数据帧的大小是巨大的,并且它们上的合并功能创建了非常大的数据帧(不允许大于20亿行),尽管我最终将数据帧子集化为较小的数据帧。但是merge()占用大量内存并终止R。
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),]
答案 0 :(得分:12)
使用Bioconductor GenomicRanges包。
source("http://bioconductor.org/biocLite.R")
biocLite("GenomicRanges")
假设有两个数据框x0
和x1
,例如原始示例中的encode
和encode.total
。我们想把它们变成GRanges实例。我这样做了
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)之间的重叠
hits = findOverlaps(gr0, gr1)
导致
> hits
Hits of length 3
queryLength: 3
subjectLength: 16
queryHits subjectHits
<integer> <integer>
1 1 4
2 2 8
3 3 10
然后更新相关的开始/结束坐标
ranges(gr0)[queryHits(hits)] = ranges(gr1)[subjectHits(hits)]
给
> 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
这将快速进入数百万个范围。