Великая функция findInterval()
в R использует левые замкнутые поддиапазоны в аргументе vec
, как показано в ее документах:
if
i <- findInterval(x,v)
, имеемv[i[j]] <= x[j] < v[i[j] + 1]
Если мне нужны закрытые суб-интервалы, какие у меня варианты? Самое лучшее, что я придумал, это:
findInterval.rightClosed <- function(x, vec, ...) {
fi <- findInterval(x, vec, ...)
fi - (x==vec[fi])
}
Еще одна работа:
findInterval.rightClosed2 <- function(x, vec, ...) {
length(vec) - findInterval(-x, -rev(vec), ...)
}
Здесь немного теста:
x <- c(3, 6, 7, 7, 29, 37, 52)
vec <- c(2, 5, 6, 35)
findInterval(x, vec)
# [1] 1 3 3 3 3 4 4
findInterval.rightClosed(x, vec)
# [1] 1 2 3 3 3 4 4
findInterval.rightClosed2(x, vec)
# [1] 1 2 3 3 3 4 4
Но я бы хотел увидеть любые другие решения, если там лучший. "Лучше", я имею в виду "как-то более удовлетворительно" или "не чувствует себя клопиком" или, может быть, даже "более эффективным". =)
(Обратите внимание, что есть аргумент rightmost.closed
для findInterval()
, но он другой - он относится только к окончательному поддиапазону и имеет другое значение.)