【发布时间】:2013-09-30 19:06:07
【问题描述】:
我有两个文件
编码
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
编码.总数
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 包。我的数据帧的大小很大,它们上的合并功能会创建一个非常大的数据帧(不允许超过 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),]
【问题讨论】:
-
在您的示例中,两个文件中的 start 和 stop 值是相同的,所以什么都不会改变...
-
我已经编辑了我的文件,请立即查看。
-
@Henrik 您指向的问题适用于 Ranges 对象,我有一个数据框对象。我不熟悉 R 中的 Ranges 对象。
-
问题中的 OP 以“两个 data.frames 每个包含三列:chrom、start & stop”开头。在我看来,它与您的数据非常相似。
标签: r