Один из вариантов - использовать outer()
для применения функции двоичного оператора >
к a
и b
:
> outer(a, b, ">")
[,1] [,2] [,3] [,4] [,5]
[1,] FALSE FALSE FALSE FALSE FALSE
[2,] FALSE FALSE TRUE FALSE TRUE
[3,] TRUE FALSE TRUE TRUE TRUE
[4,] TRUE FALSE TRUE TRUE TRUE
[5,] TRUE TRUE TRUE TRUE TRUE
[6,] TRUE TRUE TRUE TRUE TRUE
[7,] FALSE FALSE TRUE FALSE TRUE
Ответ на вопрос дается суммами строк приведенного выше результата:
> rowSums(outer(a, b, ">"))
[1] 0 2 4 4 5 5 2
Для этого примера набора данных это решение немного быстрее, чем findIntervals()
, но ненамного:
> system.time(replicate(1000, findInterval(a - 0.5, sort(b))))
user system elapsed
0.131 0.000 0.132
> system.time(replicate(1000, rowSums(outer(a, b, ">"))))
user system elapsed
0.078 0.000 0.079
Это также немного быстрее, чем версия sapply()
, но незначительно:
> system.time(replicate(1000, sapply(a, function(x)sum(b<x))))
user system elapsed
0.082 0.000 0.082
@ Чарльз отмечает, что большую часть времени в примере findInterval()
использует sort()
, который можно обойти с помощью order()
. Когда это будет сделано, решение findInterval()
будет быстрее, чем решение outer()
:
> system.time(replicate(1000, findInterval(a - 0.5, b[order(b)])))
user system elapsed
0.049 0.000 0.049