gpt4 book ai didi

r - 查找两个区间数据之间的重叠范围

转载 作者:行者123 更新时间:2023-12-04 14:01:21 24 4
gpt4 key购买 nike

我有一张表,其坐标( startend )为 ca。 500000 个片段和另一个具有 60000 个单个坐标的表,我想与以前的片段匹配。即,对于来自 dtCoords 的每条记录表 我需要在 dtFrags 中搜索记录具有相同的表 chrstart <= 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]
}

但我仍然不清楚我应该如何在里面工作......我将非常感谢任何提示。

更新。以防万一,我把我的真实表放在文件中 here .解压到您的工作目录后,可以使用以下代码加载表:
dtCoords <- fread("dtCoords.txt", sep="\t", header=TRUE)
dtFrags <- fread("dtFrags.txt", sep="\t", header=TRUE)

最佳答案

一般来说,使用bioconductor是非常合适的。包裹 IRanges 处理与间隔相关的问题。它通过实现 interval tree 有效地做到了这一点。 . GenomicRanges 是另一个建立在 IRanges 之上的包,专门用于处理“基因组范围”。

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

关于r - 查找两个区间数据之间的重叠范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19748535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com