La grande funzione findInterval()
in R utilizza sinistra-chiuso sottointervalli nel suo argomento vec
, come mostrato nelle documenti:findInterval() con intervalli di destra chiuso
se
i <- findInterval(x,v)
, abbiamov[i[j]] <= x[j] < v[i[j] + 1]
Se voglio intervalli secondari chiusi a destra, quali sono le mie opzioni? Il migliore che è venuta in mente è questa:
findInterval.rightClosed <- function(x, vec, ...) {
fi <- findInterval(x, vec, ...)
fi - (x==vec[fi])
}
Un altro si lavora anche:
findInterval.rightClosed2 <- function(x, vec, ...) {
length(vec) - findInterval(-x, -rev(vec), ...)
}
Ecco un piccolo 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
ma mi piacerebbe vedere alcun altre soluzioni se ce n'è una migliore. Per "meglio", intendo "in qualche modo più soddisfacente" o "non mi sento un kludge" o forse anche "più efficiente". =)
(Si noti che c'è un argomento rightmost.closed
a findInterval()
, ma è diverso - si riferisce soltanto alla finale sub-intervallo ed ha un significato diverso)
Cosa ne pensi: 'findInterval (x, c (-Inf, testa (vec, -1)))'? – sgibb
@sgibb che non sembra fare il trucco, ho aggiunto un esempio e il tuo non dà lo stesso risultato. –
Qui sono un po 'confuso, ma 'findInterval (x-1, vec)' fa quello che stai cercando? – thelatemail