Re: [R] group bunch of lines in a data.frame, an additional requirement

From: Marc Schwartz (via MN) <mschwartz_at_mn.rr.com>
Date: Wed 13 Sep 2006 - 17:33:12 GMT

Try something like this:

# Initial data frame
> DF

  V1 V2 V3 V4

1  A 1.0 200 ID1
2  A 3.0 800 ID1
3  A 2.0 200 ID1
4  B 0.5  20 ID2
5  B 0.9  50 ID2
6  C 5.0  70 ID1


# Now do the aggregation to get the means DF.1 <- aggregate(DF[, 2:3], list(V1 = DF$V1), mean)

> DF.1

  V1 V2 V3

1  A 2.0 400
2  B 0.7  35
3  C 5.0  70


# Now get the unique combinations of letters and IDs in DF DF.U <- unique(DF[, c("V1", "V4")])

> DF.U

  V1 V4
1 A ID1
4 B ID2
6 C ID1

# Now merge the two data frames together, matching the letters DF.NEW <- merge(DF.1, DF.U, by = "V1")

> DF.NEW

  V1 V2 V3 V4

1  A 2.0 400 ID1
2  B 0.7  35 ID2
3  C 5.0  70 ID1


See ?unique and ?merge for more information.

Also, for the sake of clarification, these are not matrices, but data frames. A matrix may contain only one data type, whereas data frames are specifically designed to contain multiple data types as you have here.

HTH, Marc Schwartz

On Wed, 2006-09-13 at 17:38 +0100, Emmanuel Levy wrote:
> Thanks for pointing me out "aggregate", that works fine!
>
> There is one complication though: I have mixed types (numerical and character),
>
> So the matrix is of the form:
>
> A 1.0 200 ID1
> A 3.0 800 ID1
> A 2.0 200 ID1
> B 0.5 20 ID2
> B 0.9 50 ID2
> C 5.0 70 ID1
>
> One letter always has the same ID but one ID can be shared by many
> letters (like ID1)
>
> I just want to keep track of the ID, and get a matrix like:
>
> A 2.0 400 ID1
> B 0.7 35 ID2
> C 5.0 70 ID1
>
> Any idea on how to do that without a loop?
>
> Many thanks,
>
> Emmanuel
>
> On 9/12/06, Emmanuel Levy <emmanuel.levy@gmail.com> wrote:
> > Hello,
> >
> > I'd like to group the lines of a matrix so that:
> > A 1.0 200
> > A 3.0 800
> > A 2.0 200
> > B 0.5 20
> > B 0.9 50
> > C 5.0 70
> >
> > Would give:
> > A 2.0 400
> > B 0.7 35
> > C 5.0 70
> >
> > So all lines corresponding to a letter (level), become a single line
> > where all the values of each column are averaged.
> >
> > I've done that with a loop but it doesn't sound right (it is very
> > slow). I imagine there is a
> > sort of "apply" shortcut but I can't figure it out.
> >
> > Please note that it is not exactly a matrix I'm using, the function
> > "typeof" tells me it's a list, however I access to it like it was a
> > matrix.
> >
> > Could someone help me with the right function to use, a help topic or
> > a piece of code?
> >
> > Thanks,
> >
> > Emmanuel
> >



R-help@stat.math.ethz.ch 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. Received on Thu Sep 14 03:38:40 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Wed 13 Sep 2006 - 18:30:04 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.