[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]]
Please post plain text only.

-- 
Brian S. Diggs, PhD
Senior Research Associate, Department of Surgery
Oregon Health & Science University



More information about the R-help mailing list