Identifies TRUE elements in a logical vector
Identifies TRUE elements in a logical vector.
## S3 method for class 'logical' whichVector(x, na.rm=TRUE, use.names=TRUE, ...)
In R v2.11.0 which
() was made approx. 10 times
faster via a native implementation. Because of this, this
method is of little use and approximately 3 times slower.
However, for earlier version of R, this method is still
significantly faster. For example,
simple comparison on R v2.7.1 on Windows XP, show that
this implementation can be more than twice as fast as
which
(), especially when there are no missing
value (and na.rm=FALSE
) is used.
Henrik Bengtsson
which
()
## Not run: # - - - - - - - - - - - - - - - - - - - - - - - - - - # Simulate two large named logical vectors, # one with missing values one without # - - - - - - - - - - - - - - - - - - - - - - - - - - N <- 1e6 # Vector #1 x <- sample(c(TRUE, FALSE), size=N, replace=TRUE) names(x) <- seq_along(x) # Vector #2 y <- x y[sample(N, size=0.1*N)] <- NA # - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate consistency # - - - - - - - - - - - - - - - - - - - - - - - - - - stopifnot(identical(which(x), whichVector(x))) stopifnot(identical(which(y), whichVector(y))) # - - - - - - - - - - - - - - - - - - - - - - - - - - # Benchmarking # - - - - - - - - - - - - - - - - - - - - - - - - - - # Number of iterations K <- 5 t1 <- 0 for (kk in 1:K) { t1 <- t1 + system.time({ idxs1 <- which(x) }) } t2 <- 0 for (kk in 1:K) { t2 <- t2 + system.time({ idxs2 <- whichVector(x, na.rm=FALSE) }) } cat(sprintf("whichVector(x, na.rm=FALSE)/which(x): %.2f\n", (t2/t1)[3])) stopifnot(identical(idxs1, idxs2)) t1 <- 0 for (kk in 1:K) { t1 <- t1 + system.time({ idxs1 <- which(y) }) } t2 <- 0 for (kk in 1:K) { t2 <- t2 + system.time({ idxs2 <- whichVector(y) }) } cat(sprintf("whichVector(y)/which(y): %.2f\n", (t2/t1)[3])) stopifnot(identical(idxs1, idxs2)) ## End(Not run)
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.