我尝试使用findOverlap来解决这个问题,但我只找到没有条件的重叠区域,所以如果我有一些条件来选择数据。我该怎么办?
我们假设我有两个数据框,如下所示
dataframe a
Sample, start, stop, event, probe, length, length/probe, region
CNV1234, 2000, 3000, CN gain, 23, 235, 9, intron
CNV1534, 1200, 1800, CN loss, 60, 600 10, exon
dataframe b
Sample, start, stop, event, probe, length, length/probe, region
CNV234, 2500, 3500, CN gain, 23, 235, 9, exon
CNV34, 1200, 1800, CN loss, 60, 600 10, intron
我有两个问题
首先,我想找到这两个数据帧之间的重叠,CNV有超过50%的长度重叠,这个重叠在内含子区域
其次,我想知道重叠区域的长度。
我希望我的结果有一个像这样的数据框
Sample, start, stop, event, probe, length, length/probe, region, overlap, length of overlap
CNV1234, 2000, 3000, CN gain, 23, 235, 9, intron, CNV234, 500
答案 0 :(得分:1)
这是您的数据
a <- read.csv(textConnection(
"Sample, start, stop, event, probe, length, length/probe, region
CNV1234, 2000, 3000, CN gain, 23, 235, 9, intron
CNV1534, 1200, 1800, CN loss, 60, 600 10, exon"))
b <- read.csv(textConnection(
"Sample, start, stop, event, probe, length, length/probe, region
CNV234, 2500, 3500, CN gain, 23, 235, 9, exon
CNV34, 1200, 1800, CN loss, 60, 600 10, intron"))
加载GenomicRanges包(我假设您的数据实际上来自多条染色体,并且您希望在所有染色体上执行此操作;&#34; A&#34;是染色体名称)
library(GenomicRanges)
gr1 <- with(a, GRanges("A", IRanges(start, stop - 1L),
Sample=Sample, event=event))
gr2 <- with(b, GRanges("A", IRanges(start, stop - 1L, names=Sample),
Region=Sample))
注意GRanges如何表示范围(从1开始,包括开始和结束坐标)。找到这些对象之间的所有重叠(您可以使用min.overlaps排除某些重叠,例如,那些短于最小宽度的1/2)
h <- findOverlaps(gr1, gr2)
目前尚不清楚&#34; 50%&#34;宽度是 - 宽度? B' - 所以我计算所有重叠的宽度,然后保留那些宽度大于&#34;&#34;
的宽度的1/2的宽度。wd <- width(pintersect(gr1[queryHits(h)], gr2[subjectHits(h)]))
ok <- wd > width(gr1[queryHits(h)]) / 2
h <- h[ok]
最后,我通过选择满足重叠标准的查询并添加元数据列(mcols
)和重叠区域的重叠宽度来组合结果
result <- gr1[queryHits(h)]
mcols(result) <- cbind(mcols(result), mcols(gr2[subjectHits(h)]))
result$`width of overlap` <- wd[ok]
结果可能被强制回到as.data.frame(result)
的数据框,或者您的下游分析可能会自然地使用GRanges基础设施完成?
最好在Bioconductor Bioconductor上询问有关mailing list包的问题(无需订阅)。可能有更有效的方法来实现这一目标,该邮件列表上的人员将提供这些解决方案。