在 R 中查找数据帧范围的重叠
Finding overlap in dataframe ranges in R
我有两个 bedfile 作为 R 中的数据帧,我想将所有重叠区域相互映射(类似于 bedtools closest 能够做的)。
床A:
chr start end
2 100 500
2 200 250
3 275 300
床位B:
chr start end
2 210 265
2 99 106
8 275 290
失眠:
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")
我有两个 bedfile 作为 R 中的数据帧,我想将所有重叠区域相互映射(类似于 bedtools closest 能够做的)。
床A:
chr start end
2 100 500
2 200 250
3 275 300
床位B:
chr start end
2 210 265
2 99 106
8 275 290
失眠:
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")