Not only does it not require a loop, this is a one-liner: > myvec <- c(1,0,3,0,77,9,0,1,2,0) > sample(which(myvec == 0), 1) [1] 4 > sample(which(myvec == 0), 1) [1] 7 > sample(which(myvec == 0), 1) [1] 2
If there's a possibility of not having zeros then you'll need to check that separately, otherwise sample() will throw an error. For instance: if(any(myvec == 0)) { sample(which(myvec == 0), 1) } which() will Sarah On Thu, Oct 17, 2013 at 2:54 PM, Stock Beaver <stockbea...@ymail.com> 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) > > # If myvec is large and/or contains no zeros, > # The above loop is sub-optimal/faulty. > > # 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]] > -- Sarah Goslee http://www.functionaldiversity.org ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.