[R] apply function with grouped columns

Peter Ehlers ehlers at ucalgary.ca
Fri Jan 29 15:02:16 CET 2010


Try this:

y <- c(v1, v2, v3, v4)
rowf <- gl(2, 1, 16)
colf <- gl(2, 8, 16, labels=1:0)
dat <- data.frame(y)
aggregate(dat[1], list(Row=rowf, Col=colf), mean)

  -Peter Ehlers

Jack Siegrist wrote:
> I have a data set of many rows and many columns in which both the rows and
> the columns have associated grouping factors.
> 
> Is there a way to do what 'aggregate' does but in the other dimension?
> 
> The way I have been doing this is to use 'aggregate' on the data in the
> usual way and then rotate the result and apply 'aggregate' again. This
> works but is a little messy and I was wondering if there is some built-in
> way to do this easier.
> 
> An example of what I have been doing is below.
> 
> #Four observations of four variables
> v1 <- c(1, 8, 5, 3)
> v2 <- c(5, 5, 6, 5)
> v3 <- c(3, 2, 9, 4)
> v4 <- c(4, 1, 1, 1)
> 
> myData <- data.frame(v1=v1, v2=v2, v3=v3, v4=v4)
> myData
> 
> #The observations have either property 1 or property 2
> rowFactor <- data.frame(RowTraits=factor(c(1, 2, 1, 2)))
> rowFactor
> 
> #The variables have a property that is either present or absent
> colFactor <- data.frame(ColTraits=factor(c(1, 1, 0, 0)))
> colFactor
> 
> #Getting the means for the columns by row groups is easy
> MeanByRowTraits <- aggregate (myData, rowFactor[1], mean)
> MeanByRowTraits
> 
> #But now to get the means for the rows by column groups is awkward
> rotateData <- data.frame(t(MeanByRowTraits[2:5]))
> colnames(rotateData) <- c(levels(rowFactor[,1]))
> rotateData
> 
> #This is the kind of result I want in the end
> aggregate (rotateData, colFactor[1], mean)
> 

-- 
Peter Ehlers
University of Calgary



More information about the R-help mailing list