Hi:

When it comes to split, apply, combine, think plyr.

library(plyr)
ldply(split(afvtprelvefs, afvtprelvefs$basestudy),
         function(x) coef(lm (ef ~ quartile, data=x, weights=1/ef_std)))

         .id (Intercept)   quartile
1 CBP0908020    20.92140 3.38546887
2 CBP0908021    29.31632 0.01372604
3 CBP0908022    39.10000 3.30000000

ldply() takes a list as input and outputs a data frame. Like lapply, the
first argument is the list and the second argument is the apply function.

HTH,
Dennis


On Tue, Oct 26, 2010 at 10:22 AM, Small Sandy (NHS Greater Glasgow & Clyde)
<sandy.small@nhs.net> wrote:

> Thanks David
> That's great
>
> As a matter of interest, to get a data frame by studies why do you have to
> do
>
> fitsdf <- as.data.frame(t(as.data.frame(fits)))
>
> Why doesn't
> fitsdf <- as.data.frame(t(fits))
> work?
>
> Sandy Small
>
> ________________________________________
> From: David Winsemius [dwinsemius@comcast.net]
> Sent: 26 October 2010 16:37
> To: Small Sandy (NHS Greater Glasgow & Clyde)
> Cc: r-help@r-project.org
> Subject: Re: [R] Forcing results from lm into datframe
>
> On Oct 26, 2010, at 8:08 AM, Small Sandy (NHS Greater Glasgow & Clyde)
> wrote:
>
> > Hi
> >
> > I need some help getting results from multiple linear models into a
> > dataframe.
> > Let me explain the problem.
> >
> > I have a dataframe with ejection fraction results measured over a
> > number of quartiles and grouped by base_study.
> > My dataframe (800 different base_studies) looks like
> >
> >> afvtprelvefs
> > basestudy     quartile   ef        ef_std   entropy
> > CBP0908020  1           21.6    0.53        3.27
> > CBP0908020  2           32.5    0.61        3.27
> > CBP0908020  3           30.8    0.63        3.27
> > CBP0908020  4           33.6    0.37        3.27
> > CBP0908022  1           42.4    0.52        1.80
> > CBP0908021  1           29.4    0.70        2.63
> > CBP0908021  2           29.2    0.42        2.63
> > CBP0908021  3           29.7    0.89        2.63
> > CBP0908021  4           29.3    0.50        2.63
> > CBP0908022  2           45.7    1.30        1.80
> > ...
> >
> > What I want to do is apply a weighted linear fit to the results from
> > each base study and get the gradient out of it. I then want to plot
> > the gradient against the entropy (which is constant for each base
> > study).
> >
> > I can get apply a linear fit with
> >
> >> fits <- by(afvtprelvefs, afvtprelvefs$basestudy, function (x) lm
> >> (ef ~ quartile, data=x, weights=1/ef_std))
> >
> > but how do I get the results from that into a dataframe which I can
> > use?
> >
> > I thought I might get somewhere with
> >> sapply(fits, "[[", "coefficients")
> >
> > But that doesn't give me the basestudy separately so that I can
> > match up the results with the entropy results.
>
> The by objects don't play nicely with as.data.frame so I went to a
> more "classical" way of runnning the lm call and I added a coef()
> wrapper to just get the coefficients:
>
>  > splits <-split(afvtprelvefs, afvtprelvefs$basestudy)
>  > lapply(splits, function (x) coef(lm (ef ~ quartile, data=x,
> weights=1/ef_std)))
> $CBP0908020
> (Intercept)    quartile
>   20.921397    3.385469
>
> $CBP0908021
> (Intercept)    quartile
> 29.31632071  0.01372604
>
> $CBP0908022
> (Intercept)    quartile
>        39.1         3.3
>
>  > fits <- lapply(splits, function (x) coef(lm (ef ~ quartile, data=x,
> weights=1/ef_std)))
>  > as.data.frame(fits)
>             CBP0908020  CBP0908021 CBP0908022
> (Intercept)  20.921397 29.31632071       39.1
> quartile      3.385469  0.01372604        3.3
>
>
> The split-lapply strategy is reasonably general. You may need to use
> t() if you were hoping for stufy to be by rows. In this case sapply
> would have obviated the need for the as.data.frame step at the cost of
> returning a matrix rather than a data.frame.
> --
> David
>
> >
> > I am sure this must have been answered somewhere before but I have
> > been unable to find a solution.
> > Many thanks for your help
> >
> > Sandy Small
> > NHS Greater Glasgow and Clyde
> >
> >
> >
> ********************************************************************************************************************
> >
> > This message may contain confidential information. If yo...{{dropped:
> > 24}}
> >
> > ______________________________________________
> > R-help@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.
>
>
>
>
> ********************************************************************************************************************
>
> This message may contain confidential information. If ...{{dropped:13}}

