Hello all, Consider the following problem: There is a matrix of probabilities:> set.seed(1) > probs <- array(abs(rnorm(25, sd = 0.33)), dim = c(5,5), dimnames = list(1:5, letters[1:5])) > probsa b c d e 1 0.21 0.27 0.50 0.0148 0.303 2 0.06 0.16 0.13 0.0053 0.258 3 0.28 0.24 0.21 0.3115 0.025 4 0.53 0.19 0.73 0.2710 0.656 5 0.11 0.10 0.37 0.1960 0.205 I want to sample 3 values from each row. One way to do this follows: index <- 1:ncol(probs) for(i in 1:nrow(probs)){ ## gets the indexes of the values chosen sample(index, size = 3, replace = TRUE, prob = probs[i, ]) } Is there a another way to do this? Thanks! Dan Gerlanc -- Daniel Gerlanc Williams College '07
On Fri, 2006-08-04 at 12:46 -0400, Daniel Gerlanc wrote:> Hello all, > > Consider the following problem: > > There is a matrix of probabilities: > > > set.seed(1) > > probs <- array(abs(rnorm(25, sd = 0.33)), dim = c(5,5), dimnames = list(1:5, letters[1:5])) > > probs > a b c d e > 1 0.21 0.27 0.50 0.0148 0.303 > 2 0.06 0.16 0.13 0.0053 0.258 > 3 0.28 0.24 0.21 0.3115 0.025 > 4 0.53 0.19 0.73 0.2710 0.656 > 5 0.11 0.10 0.37 0.1960 0.205 > > I want to sample 3 values from each row. > > One way to do this follows: > > index <- 1:ncol(probs) > > for(i in 1:nrow(probs)){ > > ## gets the indexes of the values chosen > > sample(index, size = 3, replace = TRUE, prob = probs[i, ]) > > } > > Is there a another way to do this? > > Thanks!> t(apply(probs, 1, function(x) sample(x, 3)))[,1] [,2] [,3] 1 0.210 0.5000 0.0148 2 0.258 0.0053 0.1300 3 0.025 0.2800 0.3115 4 0.190 0.5300 0.2710 5 0.196 0.1000 0.1100 See ?apply and ?t HTH, Marc Schwartz
From: Marc Schwartz> On Fri, 2006-08-04 at 12:46 -0400, Daniel Gerlanc wrote: > > Hello all, > > > > Consider the following problem: > > > > There is a matrix of probabilities: > > > > > set.seed(1) > > > probs <- array(abs(rnorm(25, sd = 0.33)), dim = c(5,5), > dimnames = > > > list(1:5, letters[1:5])) probs > > a b c d e > > 1 0.21 0.27 0.50 0.0148 0.303 > > 2 0.06 0.16 0.13 0.0053 0.258 > > 3 0.28 0.24 0.21 0.3115 0.025 > > 4 0.53 0.19 0.73 0.2710 0.656 > > 5 0.11 0.10 0.37 0.1960 0.205 > > > > I want to sample 3 values from each row. > > > > One way to do this follows: > > > > index <- 1:ncol(probs) > > > > for(i in 1:nrow(probs)){ > > > > ## gets the indexes of the values chosen > > > > sample(index, size = 3, replace = TRUE, prob = probs[i, ]) > > > > } > > > > Is there a another way to do this? > > > > Thanks! > > > t(apply(probs, 1, function(x) sample(x, 3))) > [,1] [,2] [,3] > 1 0.210 0.5000 0.0148 > 2 0.258 0.0053 0.1300 > 3 0.025 0.2800 0.3115 > 4 0.190 0.5300 0.2710 > 5 0.196 0.1000 0.1100Hmm... If I read Daniel's code (which is different from his description) correctly, that doesn't seem to be what he wanted. Perhaps something like this: apply(probs, 1, function(p) sample(1:ncol(probs), 3, replace=TRUE, prob=p)) Andy> See ?apply and ?t > > HTH, > > Marc Schwartz