[R] make apply() return a list
Gabor Grothendieck
ggrothendieck at myway.com
Tue Nov 2 15:29:32 CET 2004
Arne Henningsen <ahenningsen <at> email.uni-kiel.de> writes:
:
: 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
:
Perhaps any comparison should also include simplicity. This is
somewhat subjective but just to objectify it I have reworked
each solution to compactify it as much as I could and then
calculated the number of characters in each solution using wc:
AH - 293 characters
TP - 70 characters
ML - 62 characters
GG - 48 characters
The versions I used are below.
---
# data
myData <- data.frame( a = c( 1,2,3 ), b = c( 4,5,6 ) )
# AH
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
# TP
lapply(apply(myData, 1, function(x) list(matrix(x, 2, 2))), "[[", 1)
# ML
lapply(1:nrow(myData), function(i) matrix(myData[i,], 2, 2))
# GG
lapply(as.data.frame(t(myData)), matrix, 2, 2)
More information about the R-help
mailing list