我有两份文件
编码,编码
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 ACCGGATGCTencode.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和stop完成。如果第一个文件中的开始值和停止值位于同一染色体的第二个文件的开始和停止之间,那么第一个文件中的开始和停止值应该被第二个文件的开始和停止值替换。为此,我编写了一个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包。我的dataframes的大小很大,它们上的合并函数创建了一个非常大的dataframe (超过20亿行,这是不允许的),尽管我最终将dataframe子集在一个较小的数据中。但是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),]发布于 2013-10-01 01:29:22
使用生物导体 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这将很快达到数百万的范围。
https://stackoverflow.com/questions/19101849
复制相似问题