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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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, [EMAIL PROTECTED] <[EMAIL PROTECTED]> 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@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. > > > > > > ______________________________________________ R-help@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.