[R] make apply() return a list

Tony Plate tplate at blackmesacapital.com
Mon Nov 1 19:55:20 CET 2004


for()-loops aren't so bad.  Look inside the code of apply() and see what it 
uses!  The important thing is that you use vectorized functions to 
manipulate vectors.  It's often fine to use for-loops to manipulate the 
rows or columns of a matrix, but once you've extracted a row or a column, 
then use a vectorized function to manipulate that data.

In any case, one way to get apply() to return a list is to wrap the result 
from the subfunction inside a list, e.g.:

 > x <- apply(matrix(1:6,2), 1, function(x) list((c(mean=mean(x), sd=sd(x)))))
 > x
[[1]]
[[1]][[1]]
mean   sd
    3    2


[[2]]
[[2]][[1]]
mean   sd
    4    2


 > # to remove the extra level of listing here, do:
 > lapply(x, "[[", 1)
[[1]]
mean   sd
    3    2

[[2]]
mean   sd
    4    2

 >

At Monday 11:37 AM 11/1/2004, 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
>
>--
>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/
>
>______________________________________________
>R-help at 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




More information about the R-help mailing list