[R] Replicating output from a function
Greg Snow
Greg.Snow at imail.org
Fri Feb 19 19:58:31 CET 2010
The replicate function will run code multiple times and return the output as a list (or possibly something simplified). You can then use lapply, sapply, or other tools to summarize those results.
--
Gregory (Greg) L. Snow Ph.D.
Statistical Data Center
Intermountain Healthcare
greg.snow at imail.org
801.408.8111
> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
> project.org] On Behalf Of AC Del Re
> Sent: Wednesday, February 17, 2010 1:58 PM
> To: r-help at r-project.org
> Subject: [R] Replicating output from a function
>
> Hi All,
>
> I have a function that is used with data frames having multiple id's
> per row and it aggregates the data down to 1 id per row. It also
> randomly selects one of the within-id values of a variable (mod),
> which often differ within-id. Assume this data frame (below) is much
> larger and I want to repeat this function, say 100 times, and then
> derive the mean values of r over those 100 replications. Is there an
> easy way to do this? What about in more complex situations
> where the output is r, var(r), wi, etc, and a mean of all output is
> desired, e.g.:
>
> id<-c(1,1,1,rep(4:12))
> n<-c(10,20,13,22,28,12,12,36,19,12, 15,8)
> r<-c(.68,.56,.23,.64,.49,-.04,.49,.33,.58,.18, .6,.21)
> mod1<-factor(c(1,2,2, rep(c(1,2,3),3)))
> mod2<-c(1,2,15,rep(3,9))
> datas<-data.frame(id,n,r,mod1,mod2)
>
> # intermediate level fuction (courtesy of Hadley Wickham):
>
> pick_one <- function(x) {
> if (length(x) == 1) return(x)
> sample(x, 1)
> }
>
>
> # Function that I want replicated 100 times:
>
> cat_sum1 <- function(meta, mod) {
> m <- meta
> m$mod <- mod
> meta <- ddply(m, .(id), summarize, r = mean(r), n=mean(n), mod =
> pick_one(mod))
> meta$z <- 0.5*log((1 + meta$r)/(1-meta$r))
> meta$var.z <- 1/(meta$n-3)
> meta$wi <- 1/meta$var.z
> return(meta)
> }
>
> # output from 1 run:
>
> cat_sum1(datas,datas$mod1)
> id r n mod z var.z wi
> 1 1 0.49 14.33333 2 0.53606034 0.08823529 11.33333
> 2 4 0.64 22.00000 1 0.75817374 0.05263158 19.00000
> 3 5 0.49 28.00000 2 0.53606034 0.04000000 25.00000
> 4 6 -0.04 12.00000 3 -0.04002135 0.11111111 9.00000
> 5 7 0.49 12.00000 1 0.53606034 0.11111111 9.00000
> 6 8 0.33 36.00000 2 0.34282825 0.03030303 33.00000
> 7 9 0.58 19.00000 3 0.66246271 0.06250000 16.00000
> 8 10 0.18 12.00000 1 0.18198269 0.11111111 9.00000
> 9 11 0.60 15.00000 2 0.69314718 0.08333333 12.00000
> 10 12 0.21 8.00000 3 0.21317135 0.20000000 5.00000
>
> Is there a way that I could get this to run multiple times
> (internally) and then output in a similar format as above but with the
> mean values from the multiple runs?
>
> Any help is much appreciated!
>
> AC
>
> ______________________________________________
> R-help at 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.
More information about the R-help
mailing list