Одна из моих недавних задач - подсчитать количество пересеченний сессий пользователя с другими пользователями. Вроде бы тривиальная задача на count overlaps, однако за решением пришлось обращаться аж к пакетам для Bioconductor. Простейший код, начиная с установки соответствующего пакета, выглядит следующим образом:

source("http://bioconductor.org/biocLite.R")
biocLite("IRanges")
library(IRanges)

Далее создаем тестовую таблицу с интервалами, в моем случае — временными, в формате POSIXct:

dataset <- data.frame(
    id = seq_len(3), 
    start = as.POSIXct(c("2014-01-23 16:18:35", "2014-01-23 16:08:07", "2014-01-23 12:30:33")),
    end = as.POSIXct(c("2014-01-23 17:51:25", "2014-01-23 17:11:22", "2014-01-23 14:00:23"))
)
a

Иногда хочется посмотреть и лично удостовериться, что интервалы пересекаются. Нарисуем график:

library(ggplot2)
ggplot(data = dataset) + 
  geom_segment(aes(x = start, xend = end, y = id, yend = id), size = 3) +
  scale_y_discrete(breaks = seq_len(3)) + theme_bw()

Как мы видим, два интервала все же пересекаются. Подсчитаем количество пересекающихся интервалов с помощью функций countOverlaps(). Если требуется посчитать пересечения между разными массивами, то корректнее каждый массив интервалов вывести в отдельные переменные с помощью функции IRanges(). В нашем случае мы считаем пересечения внутри одного массива интервалов, поэтому отдельную переменную решили не создавать. Для того, чтобы исключить из подчета пересечения интервала с самим собой, необходимо вычесть единицу из результата подсчета.

dataset$overlaps <- countOverlaps(IRanges(as.numeric(dataset$start), as.numeric(dataset$end))) - 1
dataset
#>   id               start                 end overlaps
#> 1  1 2014-01-23 16:18:35 2014-01-23 17:51:25        1
#> 2  2 2014-01-23 16:08:07 2014-01-23 17:11:22        1
#> 3  3 2014-01-23 12:30:33 2014-01-23 14:00:23        0