[R] make apply() return a list

Arne Henningsen ahenningsen at email.uni-kiel.de
Mon Nov 1 19:37:08 CET 2004


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

-- 
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