[R] Sampling from a Matrix
Daniel Gerlanc
dgerlanc at gmail.com
Thu Aug 10 17:07:53 CEST 2006
Once again, thanks for your help.
I did not state the problem correctly, though the code is correct for
what I want to do.
A better description of the problem would be that 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
The column names, dimnames(probs)[[2]], are the names of units to be
sampled. Each row is a trial. For each row (trial), I want to
sample 3 of the units such that for each row I get a vector like the
following:
[1] "a", "b", "a"
The samples are to be done with replacement, and these vectors could
be combined to form a matrix of the samples.
The purpose of the "probs" matrix is to give each unit a probability
that it will be sampled.
One way to do this follows:
index <- 1:ncol(probs)
res <- matrix(0,
nrow = dim(probs)[1],
ncol = 3
)
for(i in 1:nrow(probs)){
## gets the indexes of the values chosen
res[, i] <- sample(index, size = 3, replace = TRUE, prob = probs[i, ])
}
Using "apply" as Andy described would accomplish the intended result.
-- Dan
> > Hmm... 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
>
> Andy,
>
> You are of course correct. I had focused on the description of the
> problem, rather than the code provided, presuming that the code was not
> correct, including the use of 'replace' and 'prob' in sample().
>
> I suppose it would be up to Daniel for clarification.
>
> Regards,
>
> Marc
>
>
>
--
Daniel Gerlanc
Williams College '07
More information about the R-help
mailing list