Suponha que você tenha um vetor numérico x
e um data frame df
com colunas start
e stop
. Existe uma maneira inteligente de retornar um vetor lógico com comprimento igual a x
indicando se x está em pelo menos um intervalo definido por start
ou stop
?
O caso real com o qual estou trabalhando tem length(x)
>> nrow(df)
. A maneira ingênua de fazer isso seria usar um loop for, mas eu esperava algo mais elegante e que rodasse rápido.
x <- 1:10
df <- data.frame(start = c(0, 4.5, 6), stop = c(1, 5.5, 8.5))
z <- rep(FALSE, length(x))
for(i in 1:nrow(df)){
z <- z | (df$start[i] <= x & x <= df$stop[i])
}
x[z] # 1 5 6 7 8
Talvez você possa usar
outer
como abaixoou você pode usar
%inrange%
dedata.table
Talvez isso seja muito inteligente, mas resolve seu problema. (@ThomasIsCoding's é muito semelhante, mas um pouco mais compacto...)
Ainda mais rápido seria usar
Rcpp
para escrever código que fizesse um loop e um curto-circuito (ou seja, retornasse TRUE assim que a condição fosse atendida uma vez para um dadox
, em vez de passar por todas as comparações)Editar: Como o usuário ThomasIsCoding gentilmente aponta, há
data.table::inrange()
um que é vetorizado: