# [R] Newb: How I find random vector index?

Brian Diggs diggsb at ohsu.edu
Thu Oct 17 21:17:39 CEST 2013

```On 10/17/2013 11:54 AM, Stock Beaver wrote:
> # Suppose I have a vector:
>
> myvec = c(1,0,3,0,77,9,0,1,2,0)
>
> # I want to randomly pick an element from myvec
> # where element == 0
> # and print the value of the corresponding index.
>
> # So, for example I might randomly pick the 3rd 0
> # and I would print the corresponding index
> # which is 7,
>
> # My initial approach is to use a for-loop.
> # Also I take a short-cut which assumes myvec is short:
>
> elm = 1
> while (elm != 0) {
>    # Pick a random index, (it might be a 0):
>    rndidx = round(runif(1, min=1, max=length(myvec)))
>    elm = myvec[rndidx]
>    if(elm == 0)
>      print("I am done")
>    else
>      print("I am not done")
> }
> print(rndidx)

It's a little easier if you re-arrange your problem statement. This is
equivalent: return randomly one index of myvec for which the element of
myvec equals 0. A direct implementation of this is

sample(which(myvec==0), 1)

which(myvec==0) returns a vector of indexes of myvec for which the value
of the vector is 0. sample(..., 1) randomly selects one of those.

> # If myvec is large and/or contains no zeros,
> # The above loop is sub-optimal/faulty.

This approach also fails if there is no 0's in the vector. What do you
want the result to be when that is the case? If we go with the simple
answer of NA, then you can special case that (and wrap it up into a
function)

OneZeroIndex <- function(myvec) {
zeros <- which(myvec==0)
if (length(zeros) > 0) {
sample(zeros, 1)
} else {
NA
}
}

> # I suspect that skilled R-people would approach this task differently.
> # Perhaps they would use features baked into R rather than use a loop?
> 	[[alternative HTML version deleted]]