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

Spencer Graves spencer.graves at pdf.com
Fri Jun 6 00:49:07 CEST 2003


Hi, Thomas, et al.:

Thanks for the reply.  Unfortunately, "do.call" strips off the subset 
identifiers, which I want to use for further modeling:

 > do.call("rbind", byFits)
      (Intercept)              x
[1,]   0.3333333 -1.517960e-016
[2,]   0.6666667  3.282015e-016

The following does what I want using a "for" loop:

 > by.df <- data.frame(A=rep(c("A1", "A2"), each=3),
+  B=rep(c("B1", "B2"), each=3), x=1:6, y=rep(0:1, length=6))
 > by.lvls <- paste(as.character(by.df$A), as.character(by.df$B), sep=":")
 > A.B <- unique(by.lvls)
 > Fits <- data.frame(A.B = A.B, .Intercept.=rep(NA, length(A.B)),
+  x=rep(NA, length(A.B)))
 > Fits$A <- substring(A.B, 1, regexpr(":", A.B)-1)
 > Fits$B <- substring(A.B, regexpr(":", A.B)+1)
 > for(i in 1:length(A.B))
+  Fits[i, 2:3] <- coef(lm(y~x, by.df[by.lvls==A.B[i],]))
 > Fits
     A.B X.Intercept.             x  A  B
1 A1:B1    0.3333333 -1.517960e-16 A1 B1
2 A2:B2    0.6666667  3.282015e-16 A2 B2
 >

	  I wondered if there was something easier.

Thanks again for your reply.
Spencer Graves

Thomas Lumley wrote:
> On Thu, 5 Jun 2003, 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?
> 
> 
> do.call("rbind", byFits)
> 
> 
> 	-thomas
>




More information about the R-help mailing list