Hi:
Here's a slightly different approach, using both mapply() in base (a la
David) and mlply() in plyr.
My thought was to put the arguments together into a three column data frame;
the names were chosen to correspond to the first three arguments of runif():
params <- data.frame(n = as.vector(rate_number),
min = as.vector(range_mat[-6, ]),
max = as.vector(range_mat[-1, ]))
> params
n min max
[1,] 5 6.25 6.75
[2,] 15 6.75 7.25
[3,] 60 7.25 8.75
[4,] 15 8.75 9.25
[5,] 5 9.25 9.75
[6,] 0 8.50 9.00
[7,] 20 9.00 9.50
[8,] 60 9.50 10.50
[9,] 20 10.50 11.00
[10,] 0 11.00 11.50
[11,] 10 4.25 4.75
[12,] 20 4.75 5.25
[13,] 40 5.25 5.75
[14,] 20 5.75 6.25
[15,] 10 6.25 6.75
Since the sample sizes are to be unequal, we need to output them to a list,
which can be collapsed at the end if a vector is preferred.
# mapply() approach:
ll <- list()
ll <- with(params, mapply(runif, n, min, max))
> sapply(ll, length)
[1] 5 15 60 15 5 0 20 60 20 0 10 20 40 20 10
> sum(sapply(ll, length) )
[1] 300
myUniformSample1 <- unlist(ll) # collapse to vector
# mlply approach: the input data frame is the first argument, followed by
the function name
library(plyr)
samp <- mlply(params, runif)
sapply(samp, length)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
5 15 60 15 5 0 20 60 20 0 10 20 40 20 10
> sum(sapply(smp, length))
[1] 300
myUniformSample2 <- unlist(samp)
HTH,
Dennis
On Fri, Sep 3, 2010 at 3:32 AM, Sarah Sanchez <[email protected]>wrote:
>
>
>
>
> Dear R helpers
>
> I have following dataset
>
> rate_number = matrix(c(5, 15, 60, 15, 5, 0, 20, 60, 20,0, 10, 20, 40, 20,
> 10), nrow = 5, ncol = 3)
>
> range_mat = matrix(c(6.25, 6.75, 7.25, 8.75, 9.25, 9.75, 8.5, 9, 9.5, 10.5,
> 11, 11.5, 4.25, 4.75, 5.25, 5.75, 6.25, 6.75), nrow = 6, ncol = 3)
>
> > rate_number
> [,1] [,2] [,3]
> [1,] 5 0 10
> [2,] 15 20 20
> [3,] 60 60 40
> [4,] 15 20 20
> [5,] 5 0 10
>
> > range_mat
> [,1] [,2] [,3]
> [1,] 6.25 8.5 4.25
> [2,] 6.75 9.0 4.75
> [3,] 7.25 9.5 5.25
> [4,] 8.75 10.5 5.75
> [5,] 9.25 11.0 6.25
> [6,] 9.75 11.5 6.75
>
> My problem is to generate random numbers in line with rate_number and using
> the range_mat. E.g.
>
> I need to generate (5, 15, 60, 15, 5 i.e. the first column of rate_number)
> uniform random numbers (using 1st column of range_mat) s.t the first 5
> numbers will be in the range (6.25 - 6.75), next 15 numbers should be in the
> range (6.75 to 7.25), next 60 numbers should be in the range (7.25 to 8.75),
> next 15 numbers in the range (8.75 to 9.25) and last 5 numbers in the range
> (9.25 to 9.75).
>
> Similarily, I need to generate (0, 20, 60, 20, 0 i.e. 2nd column of
> rate_number) uniform random numbers in the range (using 2nd column of
> range_mat) i.e. (8.5 to 9), (9 to 9.5), (9.5 to 10.5), (10.5 to 11), (11 to
> 11.5) respectively.
>
> I could have generated these random numbers Individually using runif, but
> main problem is range_number could be anything i.e. there may be 50 rates
> but for each rate, no of rate combination will always be 5 i.e. rate_number
> will always have 5 rows only and also range_mat will always have 6 rows
> only.
>
> I tried writing loops and even tapply etc. but just can't get through.
>
> I sincerely request you to kindly guide me.
>
> Regards
>
> Sarah
>
>
>
>
>
>
>
> [[alternative HTML version deleted]]
>
>
> ______________________________________________
> [email protected] 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.
>
>
[[alternative HTML version deleted]]
______________________________________________
[email protected] 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.