Abaixo está o código para estimar a associação de grupo de cada elemento de um grande vetor
Interval = data.frame(lowerLimit = c(0, c(13.31, 14.1, 14.52, 15.9, 17.88, 20.85, 22.14, 22.6, 23.49,
24.31, 26.54, 27.29, 32.41, 33.49, 35.08, 38.25, 41.84, 46, 47.35,
47.85, 48.13, 48.25, 48.8, 50.83, 51.55, 53.22, 54.21, 55.94,
56.31, 58.09, 58.35, 59.92, 60.78, 64.9, 68.7, 72.79, 77.27,
78.38, 79.04, 80.61, 85.52, 86.25, 86.63, 88.05, 90.07, 90.25,
95.13, 96.88, 98.47, 99.77)), upperLimit = c(13.31, 14.1, 14.52, 15.9, 17.88, 20.85, 22.14, 22.6, 23.49,
24.31, 26.54, 27.29, 32.41, 33.49, 35.08, 38.25, 41.84, 46, 47.35,
47.85, 48.13, 48.25, 48.8, 50.83, 51.55, 53.22, 54.21, 55.94,
56.31, 58.09, 58.35, 59.92, 60.78, 64.9, 68.7, 72.79, 77.27,
78.38, 79.04, 80.61, 85.52, 86.25, 86.63, 88.05, 90.07, 90.25,
95.13, 96.88, 98.47, 99.77, 100))
set.seed(1)
Num = runif(100000, 0, 100)
sapply(Num, function(i) which(Interval$lowerLimit <= i & Interval$upperLimit > i))
Embora o código acima possa estimar a associação de grupo para cada elemento de Num
, gostaria de saber se existe algum método mais eficiente e rápido disponível. Para vetores grandes, este código está demorando muito.
Muito obrigado pela sua sugestão.
Se a eficiência estiver em jogo e
Interval
não for necessariamente contíguo, podemos escrever nossa própria{Rcpp}
função:Se você tiver um número maior de intervalos (pense em 100 mil ou mais), você deve (provavelmente) usar a busca binária, já que seus intervalos são contíguos e já estão classificados.
Uso
Como seu
Interval
contém intervalos contíguos, você pode usarfindInterval
.Parece
findInterval
ser cerca de 100x mais rápido e com os mesmos resultados.Base
R
1)
cut()
Para completar,
cut()
foi mencionado pelo usuário @AkselA em um comentário abaixo da pergunta.É necessária coerção para corresponder à saída
grp1
. Isso não precisa ser o caso em aplicações reais.2)
.bincode()
Um barebone interessante e
cut()
relacionado é , que deve funcionar aqui e parece ser tão rápido quanto ..bincode()
findInterval()