2016-03-21 6 views
2

У меня есть data.frame, который состоит из линейных интервалов для каждого id:линейных интервалов Объединить

df <- data.frame(id = c(rep("a",3),rep("b",4),rep("d",4)), 
       start = c(3,4,10,5,6,9,12,8,12,15,27), 
       end = c(7,8,12,8,9,13,13,10,15,26,30)) 

Я ищу для эффективной функции, которая объединит все пересекающиеся интервалы на каждую id. Для df результат плохо быть:

res.df <- data.frame(id = c("a","a","b","d","d","d"), 
        start = c(3,10,5,8,12,27), 
        end = c(8,12,13,10,26,30)) 

За что в конце концов я буду иметь возможность суммировать все объединенные интервалы на каждую id, чтобы их общая длина:

sapply(unique(res.df$id), function(x) sum(res.df$end[which(res.df$id == x)]-res.df$start[which(res.df$id == x)]+1)) 
+0

Это может быть полезно: http://stackoverflow.com/questions/27574775/is-it-possible-to-use-the-r-data-table-funcion-foverlaps-to-find-the-intersectio – thelatemail

ответ

3
#source("https://bioconductor.org/biocLite.R") 
#biocLite("IRanges") 
library(IRanges) 
df1 <- as(df, "RangedData") 

as.data.frame(reduce(df1, by = "id", min.gapwidth = 0.5)) 

# space start end width id 
#1  1  3 8  6 a 
#2  1 10 12  3 a 
#3  1  5 13  9 b 
#4  1  8 10  3 d 
#5  1 12 26 15 d 
#6  1 27 30  4 d