Become an expert in R — Interactive courses, Cheat Sheets, certificates and more!
Get Started for Free

whichVector.logical

Identifies TRUE elements in a logical vector


Description

Identifies TRUE elements in a logical vector.

NOTE: which() should be used instead of this method unless you are running R (< 2.11.0), for which this method is faster than which() for logical vectors, especially when there are no missing values.

Usage

## S3 method for class 'logical'
whichVector(x, na.rm=TRUE, use.names=TRUE, ...)

Arguments

x

A logical vector of length N.

na.rm

If TRUE, missing values are treated as FALSE, otherwise they are returned as NA.

use.names

If TRUE, the names attribute is preserved, otherwise it is not return.

...

Not used.

Value

Returns an integer vector of length less or equal to N.

Benchmarking

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.

Author(s)

Henrik Bengtsson

See Also

Examples

## 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)

R.utils

Various Programming Utilities

v2.10.1
LGPL (>= 2.1)
Authors
Henrik Bengtsson [aut, cre, cph]
Initial release

We don't support your browser anymore

Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.