[R] Loop with string variable AND customizable "summary" output

Gabor Grothendieck ggrothendieck at gmail.com
Mon Jan 29 18:08:41 CET 2007


And yet one more.  This one does not use eval but uses do.call, quote
and bquote instead:

lapply(levels(CO2$Treatment), function(lev) do.call("lm",
     list(uptake ~ conc, quote(CO2), subset = bquote(Treatment == .(lev)))))


On 1/29/07, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:
> In thinking about this a bit more here is an even shorter one yet it
> does show the level in the Call output.  See ?bquote
>
> lapply(levels(CO2$Treatment), function(lev)
>   eval(bquote(lm(uptake ~ conc, CO2, subset = Treatment == .(lev)))))
>
>
> On 1/29/07, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:
> > Often you will find that if you arrange your data in a
> > desirable way in the first place everything becomes
> > easier.  What you really want is a data frame such
> > as the last three columns of the builtin data frame
> > CO2 where Treatment corresponds to country and
> > the two numeric variables correspond to your y and x.
> >
> > Then its easy:
> >
> > lapply(levels(CO2$Treatment), function(lev)
> >   lm(uptake ~ conc, CO2, subset = Treatment == lev))
> >
> > The only problem with the above is that the Call: in the
> > output does not really tell you which level of Treatment
> > is being used since it literally shows
> >  "lm(uptake ~ conc, CO2, subset = Treatment == lev)"
> > each time.  To get around substitute the value of lev in.
> > Because R uses delayed evaluation you also need to force the
> > evaluation of lev prior to substituting it in:
> >
> > lapply(levels(CO2$Treatment), function(lev) {
> >   lev <- force(lev)
> >   eval(substitute(lm(uptake ~ conc, CO2, subset = Treatment == lev)),
> >     list(lev = lev))
> > })
> >
> >
> > Now if you really want to do it the way you specified originally
> > try this.
> >
> > Suppose we use attach to grab the variables
> > x1, x2, x3, x4, y1, y2, y3, y4 out of the builtin
> > anscombe data frame for purposes of getting
> > our hands on some sample data.   In your case
> > the variables would already be in the workspace
> > so the attach is not needed.
> >
> > Then simply reconstruct the formula in fo.  You
> > could simply use lm(fo) but then the Call: in the
> > output of lm would literally read lm(fo) so its
> > better to use do.call:
> >
> > # next line gives the variables x1, x2, x3, x4, y1, y2, y3, y4
> > # from the builtin ancombe data set.
> > # In your case such variables would already exist.
> > attach(anscombe)
> > lapply(1:4, function(i) {
> >   ynm <- paste("y", i, sep = "")
> >   xnm <- paste("x", i, sep = "")
> >   fo <- as.formula(paste(ynm, "~", xnm))
> >   do.call("lm", list(fo))
> > })
> > detach(anscombe)
> >
> > Or if all the variables have the same length you could use
> > a form such as ancombe in the first place:
> >
> > Actually this is not really a recommended way of
> > proceeding. You would be better off putting all
> > your variables in a data frame and using that.
> >
> > lapply(1:4, function(i) {
> >    fo <- as.formula(paste(names(anscombe)[i+4], "~", names(anscombe)[i]))
> >    do.call("lm", list(fo, data = quote(anscombe)))
> > })
> >
> > or
> >
> > lapply(1:4, function(i) {
> >    fo <- y ~ x
> >    fo[[2]] <- as.name(names(anscombe)[i+4])
> >    fo[[3]] <- as.name(names(anscombe)[i])
> >    do.call("lm", list(fo, data = quote(anscombe)))
> > })
> >
> >
> >
> > On 1/29/07, C.Rosa at lse.ac.uk <C.Rosa at lse.ac.uk> wrote:
> > > Dear All,
> > >
> > > I am using R for my research and I have two questions about it:
> > >
> > > 1) is it possible to create a loop using a string, instead of a numeric vector? I have in mind a specific problem:
> > >
> > > Suppose you have 2 countries: UK, and USA, one dependent (y) and one independent variable (y) for each country (vale a dire: yUK, xUK, yUSA, xUSA) and you want to run automatically the following regressions:
> > >
> > >
> > >
> > > for (i in c("UK","USA"))
> > >
> > > output{i}<-summary(lm(y{i} ~ x{i}))
> > >
> > >
> > >
> > > In other words, at the end I would like to have two objects as output: "outputUK" and "outputUSA", which contain respectively the results of the first and second regression (yUK on xUK and yUSA on xUSA).
> > >
> > >
> > >
> > > 2) in STATA there is a very nice code ("outreg") to display nicely (and as the user wants to) your regression results.
> > >
> > > Is there anything similar in R / R contributed packages? More precisely, I am thinking of something that is close in spirit to "summary" but it is also customizable. For example, suppose you want different Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 or a different format display (i.e. without "t value" column) implemented automatically (without manually editing it every time).
> > >
> > > In alternative, if I was able to see it, I could modify the source code of the function "summary", but I am not able to see its (line by line) code. Any idea?
> > >
> > > Or may be a customizable regression output already exists?
> > >
> > > Thanks really a lot!
> > >
> > > Carlo
> > >
> > > ______________________________________________
> > > R-help at stat.math.ethz.ch 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