Skip to content

How to get minimum value by group

4 messages · JustinNabble, David Winsemius, Peter Alspach +1 more

#
I'd like to get a long data set of minimum values from groups in another data
set.
The following almost does what I want. (Note, I'm using the word factor
differently from it's meaning in R; bad choice of words)

myframe = data.frame(factor1 = rep(1:2,each=8), factor2 =
rep(c("a","b"),each=4, times=2), factor3 = rep(c("x","y"),each=2, times=4),
y=1:16)
attach(myframe)
minimums = by(y, list(factor1, factor2,factor3), min)
detach(myframe)

The problem is that "minimums" is object of class "by", which looks like
some kind of array with the number of dimension equal to the number of
factors. I just want two dimensions though, with factors in columns. I can't
figure out how to reformat it to something like this:

factor1 factor2 factor2 y
1         a         x         1
2         a         x         9
1         b         x         5
...

I could make nested for loops, but I'd like something that will work for an
arbitrary number of factors. I've seen some functions that will rearrange
data (e.g. reshape), but they all seem to require a data.frame to start
with.
#
On Jan 11, 2010, at 7:58 PM, JustinNabble wrote:

            
# with(myframe,   ....) would be a better construction
It's a table, which IS like an array, You want:

 > as.data.frame.table(minimums)
   Var1 Var2 Var3 Freq
1    1    a    x    1
2    2    a    x    9
3    1    b    x    5
4    2    b    x   13
5    1    a    y    3
6    2    a    y   11
7    1    b    y    7
8    2    b    y   15
#
Tena koe Justin

Try aggregate(): e.g., 

aggregate(myframe[,4], myframe[,1:3], min)

HTH ....

Peter Alspach
#
Try this:
factor1 factor2 factor3  y
1       1       a       x  1
2       2       a       x  9
3       1       b       x  5
4       2       b       x 13
5       1       a       y  3
6       2       a       y 11
7       1       b       y  7
8       2       b       y 15


On Mon, Jan 11, 2010 at 7:58 PM, JustinNabble
<justinmmcgrath at hotmail.com> wrote: