ID EN
Vector & List

which

R Base 3.6.2

Give the TRUE indices of a logical object, allowing for array indices.

Syntax

R
which(x, arr.ind = FALSE, useNames = TRUE)
arrayInd(ind, .dim, .dimnames = NULL, useNames = FALSE)

Arguments

Parameter Description
x a logical vector or array. NAs are allowed and omitted (treated as if FALSE).
arr.ind logical; should array indices be returned when x is an array?
ind integer-valued index vector, as resulting from which(x).
.dim dim(.) integer vector
.dimnames optional list of character dimnames(.). If useNames is true, to be used for constructing dimnames for arrayInd() (and hence, which(*, arr.ind=TRUE)). If names(.dimnames) is not empty, these are used as column names. .dimnames[[1]] is used as row names.
useNames logical indicating if the value of arrayInd() should have (non-null) dimnames at all.

Return Value

If arr.ind == FALSE (the default), an integer vector, or a double vector if x is a long vector, with length equal to sum(x), i.e., to the number of TRUEs in x. Basically, the result is (1:length(x))[x] in typical cases; more generally, including when x has NA's, which(x) is seq_along(x)[!is.na(x) & x] plus names when x has. If arr.ind == TRUE and x is an array (has a dim attribute), the result is arrayInd(which(x), dim(x), dimnames(x)), namely a matrix whose rows each are the indices of one elem

Examples

Example
R
# NOT RUN {
which(LETTERS == "R")
which(ll <- c(TRUE, FALSE, TRUE, NA, FALSE, FALSE, TRUE)) #> 1 3 7
names(ll) <- letters[seq(ll)]
which(ll)
which((1:12)%%2 == 0) # which are even?
which(1:10 > 3, arr.ind = TRUE)

( m <- matrix(1:12, 3, 4) )
div.3 <- m %% 3 == 0
which(div.3)
which(div.3, arr.ind = TRUE)
rownames(m) <- paste("Case", 1:3, sep = "_")
which(m %% 5 == 0, arr.ind = TRUE)

dim(m) <- c(2, 2, 3); m
which(div.3, arr.ind = FALSE)
which(div.3, arr.ind = TRUE)

vm <- c(m)
dim(vm) <- length(vm) #-- funny thing with  length(dim(...)) == 1
which(div.3, arr.ind = TRUE)
# }
# NOT RUN {
<!-- %dont -->
# }

See Also

Logic which.min for the index of the minimum or maximum and match for the first index of an element in a vector i.e. for a scalar a match(a x) is equivalent to min(which(x == a)) but much more efficient.