[R] make apply() return a list

Arne Henningsen ahenningsen at email.uni-kiel.de
Tue Nov 2 11:02:45 CET 2004


Hi,

thank you very much Sundar, Patrick, Tony, Mahub and Gabor for your helpful 
answers! All your examples work great. They are all more straightforeward 
than my example and much faster than the for-loop. 
These are the average elapsed times (in seconds) returned by system.time()[3] 
(applied to my real function and my real data):

my original for-loop: 
5.55 

the example I presented in my previous email (using apply):
2.35 

example suggested by Tony (using apply):
2.34 

example suggested by Gabor (using lapply):
2.50 

examples suggested by Sundar and Mahub (using lapply):
2.68 

Best regards,
Arne


On Monday 01 November 2004 19:52, Sundar Dorai-Raj wrote:
> Arne Henningsen wrote:
> > Hi,
> >
> > I have a dataframe (say myData) and want to get a list (say myList) that
> > contains a matrix for each row of the dataframe myData. These matrices
> > are calculated based on the corresponding row of myData. Using a
> > for()-loop to do this is very slow. Thus, I tried to use apply().
> > However, afaik apply() does only return a list if the matrices have
> > different dimensions, while my matrices have all the same dimension. To
> > get a list I could change the dimension of one matrix artificially and
> > restore it after apply():
> >
> > This a (very much) simplified example of what I did:
> >>myData <- data.frame( a = c( 1,2,3 ), b = c( 4,5,6 ) )
> >>myFunction <- function( values ) {
> >
> > +    myMatrix <- matrix( values, 2, 2 )
> > +    if( all( values == myData[ 1, ] ) ) {
> > +       myMatrix <- cbind( myMatrix, rep( 0, 2 ) )
> > +    }
> > +    return( myMatrix )
> > + }
> >
> >>myList <- apply( myData, 1, myFunction )
> >>myList[[ 1 ]] <- myList[[ 1 ]][ 1:2, 1:2 ]
> >>myList
> >
> > $"1"
> >      [,1] [,2]
> > [1,]    1    1
> > [2,]    4    4
> >
> > $"2"
> >      [,1] [,2]
> > [1,]    2    2
> > [2,]    5    5
> >
> > $"3"
> >      [,1] [,2]
> > [1,]    3    3
> > [2,]    6    6
> >
> > This exactly does what I want and really speeds up the calculation, but I
> > wonder if there is an easier way to make apply() return a list.
> >
> > Thanks for your help,
> > Arne
>
> Hi Arne,
>
> I'm not sure how much faster this will be over using `for' but you can try:
>
> lapply(seq(nrow(myData)), function(i) myFunction(myData[i, ]))
>
> --sundar

-- 
Arne Henningsen
Department of Agricultural Economics
University of Kiel
Olshausenstr. 40
D-24098 Kiel (Germany)
Tel: +49-431-880 4445
Fax: +49-431-880 1397
ahenningsen at agric-econ.uni-kiel.de
http://www.uni-kiel.de/agrarpol/ahenningsen/




More information about the R-help mailing list