which(vector1 < vector2)
A fully vectorized approach:
x <- c(1,3,1,4,2)y <- c(1,2,3,4,5,6)f <- function(x, y) { xo <- sort(unique(x)) xi <- cummax(1 + length(x) - match(xo, rev(x))) xi[cut(y, c(xo, Inf))]}f(x,y)# [1] NA 3 5 5 5 5
The advantages of full vectorization really start to kick in when both x
and y
are relatively long and each contains many distinct values:
x <- sample(1:1e4)y <- 1:1e4microbenchmark(nicola(), frank(), beauvel(), davida(), hallo(), josho(),times=5)Unit: milliseconds expr min lq mean median uq max neval cld nicola() 4927.45918 4980.67901 5031.84199 4991.38240 5052.6861 5207.00330 5 d frank() 513.05769 513.33547 552.29335 517.65783 540.9536 676.46221 5 b beauvel() 1091.93823 1114.84647 1167.10033 1121.58251 1161.3828 1345.75158 5 c davida() 562.71123 575.75352 585.83873 590.90048 597.0284 602.80002 5 b hallo() 559.11618 574.60667 614.62914 624.19570 641.9639 673.26328 5 b josho() 36.22829 36.57181 37.37892 37.52677 37.6373 38.93044 5 a
Are you looking for this?
y<-1:6max.col(outer(y,x,">"),ties.method="last")*NA^(y<=min(x))#[1] NA 3 5 5 5 5