One idea.  If sapply were to have an rm= parameter then the 
4 solutions below would reduce to:

   sapply( v, "[", 3, rm=NA )
   sapply( v, function(x) if (length(x)>=3) x[3], rm=NULL )

   sapply( 1:10, function(x) if (x%%2==0) x^2, rm=NULL )
   sapply( 1:10, function(x) if(x%%2==0)x^2 else NA, rm=NA )

---
 
Date: Mon, 10 Nov 2003 00:23:17 -0500 (EST) 
From: Gabor Grothendieck <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>, <[EMAIL PROTECTED]>, <[EMAIL PROTECTED]> 
Cc: <[EMAIL PROTECTED]> 
Subject: Re: [R] Subsetting a list of vectors 

 
 


Dirk and Ray have provided two very clever solutions which 
perform transformation and selection in one go 
by returning NA and NULL respectively for unwanted elements 
and then eliminating the NAs and NULLs. 

I thought it would be worthwhile to bring them together and 
make some further minor improvements.

Note that for the NULL solution we use the fact that 
if(FALSE)... with no else leg equals NULL.


Problem 1. If v is a list of vectors, get the vector which is the
third element of each vector in v. Do not include any elements 
for vectors with less than 3 elements.

Here the NA solution is particularly short:

as.numeric( na.omit( sapply( v, "[", 3 ) ) ) 

but the NULL solution seems closer to the list comprehension idea:

unlist( sapply( v, function(x) if (length(x)>=3) x[3] ) )


Problem 2. Express this Python program in R:
# give me the squares of the even numbers from 1-10, in a list. 
>>> [ x*x for x in range(1,11) if x%2 == 0]


Here the NULL Solution is both short and closer to the Python one:

unlist( sapply( 1:10, function(x) if (x%%2==0) x^2 ) )

while the NA solution is:

as.numeric(na.omit(sapply(1:10,function(x)if(x%%2==0)x^2 else NA)))




 --- On Mon 11/10, Gabor Grothendieck < [EMAIL PROTECTED] > wrote:
From: Gabor Grothendieck [mailto: [EMAIL PROTECTED]
To: [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED]
     Cc: [EMAIL PROTECTED]
Date: Mon, 10 Nov 2003 00:23:17 -0500 (EST)
Subject: Re: [R] Subsetting a list of vectors

<br><br>Dirk and Ray have provided two very clever solutions which <br>perform 
transformation and selection in one go <br>by returning NA and NULL respectively for 
unwanted elements <br>and then eliminating the NAs and NULLs.  <br><br>I thought it 
would be worthwhile to bring them together and <br>make some further minor 
improvements.<br><br>Note that for the NULL solution we use the fact that 
<br>if(FALSE)... with no else leg equals NULL.<br><br><br>Problem 1. If v is a list of 
vectors, get the vector which is the<br>third element of each vector in v.  Do not 
include any elements <br>for vectors with less than 3 elements.<br><br>Here the NA 
solution is particularly short:<br><br>  as.numeric( na.omit( sapply( v, "[", 3 ) ) ) 
<br><br>but the NULL solution seems closer to the list comprehension idea:<br><br>  
unlist( sapply( v, function(x) if (length(x)>=3) x[3] ) )<br><br><br>Problem 2. 
Express this Python program in R:<br>     # give me the squares of the even numbers 
from !
 1-10, in a list. <br>     >>> [ x*x for x in range(1,11) if x%2 == 0]<br><br><br>Here 
the NULL Solution is both short and closer to the Python one:<br><br>  unlist( sapply( 
1:10, function(x) if (x%%2==0) x^2 ) )<br><br>while the NA solution is:<br><br>  
as.numeric(na.omit(sapply(1:10,function(x)if(x%%2==0)x^2 else 
NA)))<br><br>______________________________________________<br>[EMAIL PROTECTED] 
mailing list<br>https://www.stat.math.ethz.ch/mailman/listinfo/r-help<br>

______________________________________________
[EMAIL PROTECTED] mailing list
https://www.stat.math.ethz.ch/mailman/listinfo/r-help

Reply via email to