R: Which indices are TRUE? (original) (raw)
which {base} | R Documentation |
---|
Description
Give the TRUE
indices of a logical object, allowing for array indices.
Usage
which(x, arr.ind = FALSE, useNames = TRUE)
arrayInd(ind, .dim, .dimnames = NULL, useNames = FALSE)
Arguments
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? Anything other than a single true value is treated as false. |
ind | integer-valued index vector, as resulting fromwhich(x). |
.dim | dim(.) integer vector. |
.dimnames | optional list of character dimnames(.). If useNames is true, to be used for constructing dimnames forarrayInd() (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. |
Value
If arr.ind == FALSE
(the default), an integer vector, or a double vector if x
is a long vector, withlength
equal to sum(x)
, i.e., to the number ofTRUE
s in x
.
Basically, the result is (1:length(x))[x]
in typical cases; more generally, including when x
has [NA](../../base/help/NA.html)
's,which(x)
is seq_along(x)[!is.na(x) & x]
plus[names](../../base/help/names.html)
when x
has.
If arr.ind == TRUE
and x
is an [array](../../base/help/array.html)
(has a [dim](../../base/help/dim.html)
attribute), the result isarrayInd(which(x), dim(x), dimnames(x))
, namely a matrix whose rows each are the indices of one element of x
; see Examples below.
Note
Unlike most other base R functions this does not coerce x
to logical: only arguments with [typeof](../../base/help/typeof.html)
logical are accepted and others give an error.
Author(s)
Werner Stahel and Peter Holzer (ETH Zurich) proposed thearr.ind
option.
See Also
[Logic](../../base/help/Logic.html)
, [which.min](../../base/help/which.min.html)
for the index of the minimum or maximum, and [match](../../base/help/match.html)
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.
Examples
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)
[Package _base_ version 4.6.0 Index]