[R] Subsetting a list of vectors

Gabor Grothendieck ggrothendieck at myway.com
Mon Nov 10 06:23:17 CET 2003

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

More information about the R-help mailing list