Вот подход data.table для сохранения метаданных для разделенного набора диапазонов.
library(GRanges)
library(data.table)
data.disjoin <- disjoin(my_data)
overlaps <- as.data.frame(findOverlaps(data.disjoin,data))
coverage.disjoin <- as.data.table(cbind(overlaps,mcols(my_data)[overlaps$subjectHits,]))
coverage.disjoin <- coverage.disjoin[,
lapply(.SD[,-1],function(x){unique(x[!is.na(x)])}),
by="queryHits"]
mcols(data.disjoin) <- coverage.disjoin[,.(sample1,sample2,sample3)]
Сначала найдите совпадения между разделенным набором диапазонов и исходными данными. Затем соберите покрытие для перекрытий в data.table
. Найдите уникальное покрытие для этого диапазона по выборке, удалив значения NA
. Обратите внимание, что .SD
является специальным символом для подмножества data.table для группы. Наконец, присоедините результат обратно к разобщенным данным.
Данные
my_data <- GRanges(
c("chr1","chr1","chr1","chr1","chr1")
,IRanges(c(1,1,4,5,6),c(3,4,5,7,7)),
sample1=c(30,NA,35,NA,60),
sample2=c(NA,40,NA,50,NA),
sample3=c(NA,35,NA,50,NA))