在R中的数据帧范围中发现重叠

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在R中的数据帧范围中发现重叠相关的知识,希望对你有一定的参考价值。

我有两个bedfile作为R中的数据帧,我想为其相互映射所有重叠区域(类似于最接近的bedtool能够执行的操作。

BedA:

chr   start   end
 2       100     500
 2       200     250
 3       275     300

床单:

chr    start    end
  2       210      265
  2       99       106
  8       275      290

BedOut:

chr   start.A   end.A  start.B  end.B
 2       100     500      210      265
 2       100     500      99       106
 2       200     250      210      265

[现在,我发现this非常相似的问题,建议使用iRanges。使用建议的方法似乎可行,但我不知道如何将输出转换为“ BedOut”之类的数据框。

答案

这里是使用data.table软件包的解决方案。

library(data.table)

chr = c(2,2,3)
start.A = c(100, 200, 275)
end.A = c(500, 250, 300)
df_A = data.table(chr, start.A, end.A)

chr = c(2,2,8)
start.B = c(210, 99, 275)
end.B = c(265, 106, 290)
df_B = data.table(chr, start.B, end.B)

首先,内部联接键chr上的数据表:

df_out = df_B[df_A, on="chr", nomatch=0]

然后过滤重叠间隔:

df_out = df_out[(start.A>=start.B & start.A<=end.B) | (start.B>=start.A & start.B<=end.A)]
setcolorder(df_out, c("chr", "start.A", "end.A", "start.B", "end.B"))

   chr start.A end.A start.B end.B
1:   2     100   500     210   265
2:   2     100   500      99   106
3:   2     200   250     210   265
另一答案

使用data.table的另一个foverlaps选项:

setkeyv(BedA, names(BedA))
setkeyv(BedB, names(BedB))
ans <- foverlaps(BedB, BedA, nomatch=0L)
setnames(ans, c("start","end","i.start","i.end"), c("start.A","end.A","start.B","end.B"))

输出:

   chr start.A end.A start.B end.B
1:   2     100   500      99   106
2:   2     100   500     210   265
3:   2     200   250     210   265

数据:

library(data.table)
BedA <- fread("chr   start   end
2       100     500
2       200     250
3       275     300")

BedB <- fread("chr    start    end
2       210      265
2       99       106
8       275      290")

以上是关于在R中的数据帧范围中发现重叠的主要内容,如果未能解决你的问题,请参考以下文章

网络技术理论:包片段帧数据报和段

网络技术理论:包片段帧数据报和段

片段中的视频视图与另一个片段重叠

计算 pandas 数据框中的重叠时间帧,按人分组

如何在 R 中表示和合并具有*日期范围*的时间序列数据帧?

从小的、大小相同的连续箱中重叠和分类计数到不规则、不均匀的箱中