I find data.table very effective for overlays using foverlaps
library(data.table)
Recreating data:
dt <- data.table(Class = c("A", "A", "A", "A", "A", "A"), Min = c(100, 120, 210, 500, 510, 705), Max = c(200, 205, 310, 630, 530, 800))
The data.table key is required for the function:
setkey(dt, Min, Max)
here we do foverlaps against ourselves, then filter by deleting those lines that overlap with foverlaps . The number of rows is then considered grouped by Min and Max .
dt_overlaps <- foverlaps(dt, dt, type = "any")[Min != i.Min & Max != i.Max, .(Class, Overlap = .N), by = c("Min", "Max")]
Thanks David Arenburg
dt[dt_overlaps, Overlap := 1]
Results:
> dt Class Min Max Overlap 1 A 100 200 1 2 A 120 205 1 3 A 210 310 NA 4 A 500 630 1 5 A 510 530 1 6 A 705 800 NA
There is probably a tidier data.table code for this, but I'm learning too.