Hi all,

This is my first post to the developers list. As I understand it,  
aggregate() currently repeats a function across cells in a dataframe  
but is only able to handle functions with single value returns.  
Aggregate() also lacks the ability to retain the names given to the  
returned value. I've created an agg() function (pasted below) that is  
apparently backwards compatible (i.e. returns identical results as  
aggregate() if the function returns a single unnamed value), but is  
able to handle named and/or multiple return values. The code may be a  
little inefficient (there must be an easier way to set up the 'temp'  
data frame than to call aggregate and remove the final column), but  
I'm suggesting that something similar to this may be profitably used  
to replace aggregate entirely.

#modified aggregate command, allowing for multiple/named output values
agg=function(z,Ind,FUN,...){
        FUN.out=by(z,Ind,FUN,...)
        num.cells=length(FUN.out)
        num.dv=length(FUN.out[[1]])
        
        temp=aggregate(z,Ind,length) #dummy data frame
        temp=temp[,c(1:(length(temp)-1))] #remove last column from dummy frame
                
        for(i in 1:num.dv){
                temp=cbind(temp,NA)
                n=names(FUN.out[[1]])[i]
                
names(temp)[length(temp)]=ifelse(!is.null(n),n,ifelse(i==1,'x',paste 
('x',i,sep='')))
                for(j in 1:num.cells){
                        temp[j,length(temp)]=FUN.out[[j]][i]
                }
        }
        return(temp)
}

#create some factored data
z=rnorm(100) # the DV
A=rep(1:2,each=25,2) #one factor
B=rep(1:2,each=50) #another factor
Ind=list(A=A,B=B) #the factor list

aggregate(z,Ind,mean) #show the means of each cell
agg(z,Ind,mean) #should be identical to aggregate

aggregate(z,Ind,summary) #returns an error
agg(z,Ind,summary) #returns named columns

#Make a function that returns multiple unnamed values
summary2=function(x){
        s=summary(x)
        names(s)=NULL
        return(s)
}
agg(z,Ind,summary2) #returns multiple columns, default names


--
Mike Lawrence
Graduate Student, Department of Psychology, Dalhousie University

Website: http://memetic.ca

Public calendar: http://icalx.com/public/informavore/Public

"The road to wisdom? Well, it's plain and simple to express:
Err and err and err again, but less and less and less."
        - Piet Hein

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to