[R] converting "by" to a data.frame?

Don MacQueen macq at llnl.gov
Fri Jun 6 01:24:33 CEST 2003


Since I don't have your by.df to test with I may not have it exactly 
right, but something along these lines should work:

byFits <- lapply(split(by.df,paste(by.df$A,by.df$B)),
                  FUN=function(data.) {
                     tmp <- coef(lm(y~x,data.))
                     data.frame(A=unique(data.$A),
                                B=unique(data.$B),
                                intercept=tmp[1],
                                slope=tmp[2])
                    })

byFitsDF <- do.call('rbind',byFits)

That's assuming I've got all the closing parantheses in the right 
places, since my email software (Eudora) doesn't do R syntax checking!

This approach can get rather slow if by.df is big, or when the 
computations in FUN are extensive (or both).

If by.df$A has mode character (as opposed to being a factor), then 
replacing A=unique(data.$A) with A=I(unique(data.$A)) might improve 
performance. You want to avoid character to factor conversions when 
using an approach like this.

-Don


At 2:54 PM -0700 6/5/03, Spencer Graves wrote:
>Dear R-Help:
>
>	  I want to (a) subset a data.frame by several columns, (b) 
>fit a model to each subset, and (c) store a vector of results from 
>the fit in the columns of a data.frame.  In the past, I've used 
>"for" loops do do this.  Is there a way to use "by"?
>
>	  Consider the following example:
>
>  > byFits <- by(by.df, list(A=by.df$A, B=by.df$B),
>+  function(data.)coef(lm(y~x, data.)))
>  > byFits
>A: A1
>B: B1
>   (Intercept)             x
>  3.333333e-01 -1.517960e-16
>------------------------------------------------------------
>A: A2
>B: B1
>NULL
>------------------------------------------------------------
>A: A1
>B: B2
>NULL
>------------------------------------------------------------
>A: A2
>B: B2
>  (Intercept)            x
>6.666667e-01 3.282015e-16
>>
>>
>#############################
>Desired output:
>
>data.frame(A=c("A1","A2"), B=c("B1", "B2"),
>	.Intercept.=c(1/3, 2/3), x=c(-1.5e-16, 3.3e-16))
>
>What's the simplest way to do this?
>Thanks,
>Spencer Graves
>
>______________________________________________
>R-help at stat.math.ethz.ch mailing list
>https://www.stat.math.ethz.ch/mailman/listinfo/r-help


-- 
--------------------------------------
Don MacQueen
Environmental Protection Department
Lawrence Livermore National Laboratory
Livermore, CA, USA




More information about the R-help mailing list