我有一个包含重叠网站的数据框,我希望能够根据此规则删除这些重叠网站。
结束(B)>开始(A)&结束(A)>开始(B)然后我们删除站点B
例如,
Chrom Start End
scaffold_98 8309 8313
scaffold_98 8311 8320
scaffold_98 8811 8815
在这种情况下,我应删除网站(8311,8320),因为它与(8309,8313)重叠。 当我们处理大数据时,有没有一种快速的方法。
答案 0 :(得分:0)
假设您的df是根据开始列排序的,这可能有效:
remove <- vector()
for (i in 2:nrow(df)){
if(df[i,3] > df[i-1, 2] && df[i-1, 3] > df[i, 2]) {
remove <- append(remove, i)
}
}
df[-remove,]
答案 1 :(得分:0)
在这里使用GenomicRanges
并不是必需的,但我建议将其用于涉及基因组坐标的更复杂的操作。它是一个非常强大的库,专为这类操作而设计。
以下是使用findOverlaps::GenomicRanges
的解决方案。
加载库。
library(GenomicRanges);
读入示例数据并转换为GRanges
对象。
df <- read.table(text =
"Chrom Start End
scaffold_98 8309 8313
scaffold_98 8311 8320
scaffold_98 8811 8815 ", header = T)
gr <- makeGRangesFromDataFrame(df);
使用findOverlaps
选择非重叠区域。
gr[unique(findOverlaps(gr, type = "any", select = "first"))];
#GRanges object with 2 ranges and 0 metadata columns:
# seqnames ranges strand
# <Rle> <IRanges> <Rle>
# [1] scaffold_98 [8309, 8313] *
# [2] scaffold_98 [8811, 8815] *
# -------
# seqinfo: 1 sequence from an unspecified genome; no seqlengths