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

Gabor Grothendieck ggrothendieck at gmail.com
Mon Jan 29 17:27:03 CET 2007

```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.
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