findInterval () z prawymi przerwami
WspaniałyfindInterval()
funkcja w R używa w swoimvec
argument, jak pokazano w dokumentach:
Jeślii <- findInterval(x,v)
, mamyv[i[j]] <= x[j] < v[i[j] + 1]
Jeśli chcę mieć pod-przedziały z zamkniętymi prawami, jakie mam opcje? Najlepsze, co wymyśliłem, to:
findInterval.rightClosed <- function(x, vec, ...) {
fi <- findInterval(x, vec, ...)
fi - (x==vec[fi])
}
Inny działa również:
findInterval.rightClosed2 <- function(x, vec, ...) {
length(vec) - findInterval(-x, -rev(vec), ...)
}
Oto mały test:
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
Ale chciałbym zobaczyć inne rozwiązania, jeśli jest lepsze. Mówiąc „lepiej”, mam na myśli „jakoś bardziej satysfakcjonujący” lub „nie czuje się jak kludge”, a może nawet „bardziej wydajny”. =)
(Zauważ, że jestrightmost.closed
argument dofindInterval()
, ale jest inny - odnosi się tylko do ostatniego pod-przedziału i ma inne znaczenie.)