5

I have an ordered vector of unique integers in R and I want to find the index of the element closest to but less than or equal to some value. For example, for the vector 4 8 15 16 23 42 and the search value 17, I would like the function to return 4, the index of 16. In Python, I would use bisect module. Is there anything similar in R?

1 Answers1

7

Base R provides findInterval, which implements a binary search:

findInterval(17, c(4, 8, 15, 16, 23, 42))

@Khashaa already mentioned this in a comment.

jan-glx
  • 7,611
  • 2
  • 43
  • 63
  • Unfortunately `findInterval` appears to be 2-3x slower than simply using `which(non_decreasing_haystack == needle)` – zdebruine Jan 19 '22 at 14:30
  • 1
    @zdebruine this probably strongly depends on the size of the `non_decreasing_haystack` and the number of `needle`s. Can you provide an benchmark? – jan-glx Apr 13 '22 at 12:30
  • @zdebruine well, your `which()` solution wouldn't work for this, because none of the values are equal to the target. You could do `which.min(abs(non_decreasing_haystack - needle))`. – Ken Williams Mar 15 '23 at 17:57