# [R] manipulating "by" lists and "ave()" functions

ivo welch ivowelch at gmail.com
Sat Jul 9 00:42:46 CEST 2011

```dear R wizards---more ignorance on my part, exacerbated by too few
examples in the function documentations.

> d <- data.frame( id=rep(1:3,3), x=rnorm(9), y=rnorm(9))

Question 1: how do I work with the output of "by"?  for example,

> b <- by( d, d\$id, function(x) coef(lm( y ~ x, data=x ) ))
> b

d\$id: 1
(Intercept)           x
0.2303      0.3618
---------------------------------------------------------------------------------------------------
d\$id: 2
(Intercept)           x
0.05785    -0.40617
---------------------------------------------------------------------------------------------------
d\$id: 3
(Intercept)           x
0.269      -0.378

getting the categories is easy:

>  names(b)
[1] "1" "2" "3"

but how do I transform the non-name info in this by() data structure
into a matrix with dimensions 3 by 2?  (presumably, there is some
vector operator that can do this kind of magic.)

Question 2:  Let's say I want to add only one of the two coefficients
to d.  The naive approach
a <- ave( d, d\$id, FUN=function(x) coef(lm( y ~ x, data=x ))[2] )
gives me the right coefficient in each row, but overwrites every
entry.  I guess I can keep only the first column of a, and add it to
d, but this seems a rather ugly and inefficient way.  How is this done
better?

Question 3: repeat question 2, but keep both the intercept and the slope.

thanks in advance, as always, for any advice.

/iaw
----
Ivo Welch (ivo.welch at gmail.com)

```