我有一张坐垫(start
,end
)的表格。 500000个片段和另一个60000单坐标表,我想与前片段匹配。即,对于来自dtCoords
表的每条记录,我需要在dtFrags
表中搜索具有相同chr
和start
< = coord
< = end
(并从type
的此记录中检索dtFrags
。完全可以使用R来做这个,或者我应该选择其他语言?
以下是我的例子:
require(data.table)
dtFrags <- fread(
"id,chr,start,end,type
1,1,100,200,exon
2,2,300,500,intron
3,X,400,600,intron
4,2,250,600,exon
")
dtCoords <- fread(
"id,chr,coord
10,1,150
20,2,300
30,Y,500
")
最后,我想有这样的事情:
"idC,chr,coord,idF,type
10, 1, 150, 1, exon
20, 2, 300, 2, intron
20, 2, 300, 4, exon
30, Y, 500, NA, NA
"
我可以通过chr
将表拆分为子表来简化任务,所以我只关注坐标
setkey(dtCoords, 'chr')
setkey(dtFrags, 'chr')
for (chr in unique(dtCoords$chr)) {
dtCoordsSub <- dtCoords[chr];
dtFragsSub <- dtFrags[chr];
dtCoordsSub[, {
# ????
}, by=id]
}
但我仍然不清楚我应该如何在里面工作......我会非常感激任何提示。
UPD。为了以防万一,我把我的真实表放在档案here中。解压缩到工作目录后,可以使用以下代码加载表:
dtCoords <- fread("dtCoords.txt", sep="\t", header=TRUE)
dtFrags <- fread("dtFrags.txt", sep="\t", header=TRUE)
答案 0 :(得分:7)
通常,使用bioconductor包IRanges
来处理与间隔相关的问题是非常合适的。它通过实施interval tree来有效地完成。 GenomicRanges
是另一个构建于IRanges
之上的软件包,专门用于处理“Genomic Ranges”。
require(GenomicRanges)
gr1 = with(dtFrags, GRanges(Rle(factor(chr,
levels=c("1", "2", "X", "Y"))), IRanges(start, end)))
gr2 = with(dtCoords, GRanges(Rle(factor(chr,
levels=c("1", "2", "X", "Y"))), IRanges(coord, coord)))
olaps = findOverlaps(gr2, gr1)
dtCoords[, grp := seq_len(nrow(dtCoords))]
dtFrags[subjectHits(olaps), grp := queryHits(olaps)]
setkey(dtCoords, grp)
setkey(dtFrags, grp)
dtFrags[, list(grp, id, type)][dtCoords]
grp id type id.1 chr coord
1: 1 1 exon 10 1 150
2: 2 2 intron 20 2 300
3: 2 4 exon 20 2 300
4: 3 NA NA 30 Y 500
答案 1 :(得分:3)
这有用吗?
您可以先使用merge
,然后使用subset
kk<-merge(dtFrags,dtCoords,by="chr",all.x=TRUE)
> kk
chr id.x start end type id.y coord
1: 1 1 100 200 exon 10 150
2: 2 2 300 500 intron 20 300
3: 2 4 250 600 exon 20 300
4: X 3 400 600 intron NA NA
kk[coord>=start & coord<=end]
chr id.x start end type id.y coord
1: 1 1 100 200 exon 10 150
2: 2 4 250 600 exon 20 300