Example ranges and genes. I'll be using plyranges for this example for the convenience.
library("plyranges")
ranges <- structure(list(seqnames = structure(c(1L, 1L, 1L, 1L), class = "factor", .Label = "I"),
start = c(1L, 6L, 11L, 16L), end = c(3L, 8L, 13L, 18L), width = c(3L,
3L, 3L, 3L), strand = structure(c(3L, 3L, 3L, 3L), class = "factor", .Label = c("+",
"-", "*"))), row.names = c(NA, -4L), class = "data.frame")
ranges <- as_granges(ranges)
> ranges
GRanges object with 4 ranges and 0 metadata columns:
seqnames ranges strand
<Rle> <IRanges> <Rle>
[1] I 1-3 *
[2] I 6-8 *
[3] I 11-13 *
[4] I 16-18 *
-------
seqinfo: 1 sequence from an unspecified genome; no seqlengths
genes <- structure(list(seqnames = structure(c(1L, 1L), class = "factor", .Label = "I"),
start = c(2L, 10L), end = c(5L, 14L), width = 4:5, strand = structure(c(3L,
3L), class = "factor", .Label = c("+", "-", "*")), names = c("ENS001912",
"ENS003901")), row.names = c(NA, -2L), class = "data.frame")
genes <- as_granges(genes)
> genes
GRanges object with 2 ranges and 1 metadata column:
seqnames ranges strand | names
<Rle> <IRanges> <Rle> | <character>
[1] I 2-5 * | ENS001912
[2] I 10-14 * | ENS003901
-------
seqinfo: 1 sequence from an unspecified genome; no seqlengths
Using left join from plyranges.
overlap <- join_overlap_left(ranges, genes)
> overlap
GRanges object with 4 ranges and 1 metadata column:
seqnames ranges strand | names
<Rle> <IRanges> <Rle> | <character>
[1] I 1-3 * | ENS001912
[2] I 6-8 * | <NA>
[3] I 11-13 * | ENS003901
[4] I 16-18 * | <NA>
-------
seqinfo: 1 sequence from an unspecified genome; no seqlengths