# [R] How to iteratively extract elements out of a list

xpRt.wannabe xprt.wannabe at gmail.com
Sat Aug 26 06:45:50 CEST 2006

```Jim and Patrick,

Both of you made the same suggestion, which works great!

A follow-up question: Suppose I change the condition 'x>2' in 'lapply'
to 'x>4', as follows:

set.seed(123)
tmpf <- function() {
x <- rpois(rpois(1,4),2)
}
n <- 3
m <- replicate(n,tmpf())
m
sub.m <- lapply(m, function(x)x[x>4])  # was x>2

As a result, I'd get:

> sub.m

[[1]]
numeric(0)

[[2]]
[1] 5

[[3]]
numeric(0)

However, what would I need to do such that 'sub.m' contains only the
non-zero length component; namely, the 'sub.m[[2]]'?  In essence, I'd
like to drop all the components of zero length such that 'sub.m'
results in:

[[1]]
[1] 5

My best effort was to use 'lapply' again:

lapply(sub.m, function(x)x[length(x)>0])

which still gives me:

[[1]]
numeric(0)

[[2]]
[1] 5

[[3]]
numeric(0)

Again, any help would be greately appreciated.

p.s. Sorry to bug you again.   I should have thought through a little
more prior to composing an example that would represent all possible
scenarios.

On 8/25/06, jim holtman <jholtman at gmail.com> wrote:
> try this:
>
> > set.seed(123)
> > tmpf <- function() {
> + x <- rpois(rpois(1,4),2)
> + }
> > n <- 3
> > m <- replicate(n,tmpf())
> > m
> [[1]]
> [1] 3 2 4
>
> [[2]]
> [1] 0 2 4 2 2 5 2
>
> [[3]]
> [1] 2 0 4 1 0
>
> > lapply(m, function(x)x[x>2])
> [[1]]
> [1] 3 4
>
> [[2]]
> [1] 4 5
>
> [[3]]
> [1] 4
>
> >
>
> On 8/25/06, xpRt.wannabe <xprt.wannabe at gmail.com> wrote:
> > Dear List,
> >
> > The following code produces a list, which is what I what:
> >
> > set.seed(123)
> > tmpf <- function() {
> > x <- rpois(rpois(1,4),2)
> > }
> > n <- 3
> > m <- replicate(n,tmpf())
> > m
> >
> > [[1]]
> > [1] 3 2 4
> >
> > [[2]]
> > [1] 0 2 4 2 2 5 2
> >
> > [[3]]
> > [1] 2 0 4 1 0
> >
> >
> > Now I need something that would to extract iteratively (or as many
> > times as
> > the size of 'n') the values that are greater than 2 in each component
> > of
> > 'm' into another list such that the sub-list would be:
> >
> > [[1]]
> > [1] 3 4
> >
> > [[2]]
> > [1] 4 5
> >
> > [[3]]
> > [1] 4
> >
> > Below is what I tried:
> >
> > for(i in 1:3)
> > sub.list <- lapply(m,subset,m[[i]]>2)
> >
> > > sub.list
> >
> > which gives me something different from what I want:
> >
> > [[1]]
> > [1] 4
> >
> > [[2]]
> > [1] 4
> >
> > [[3]]
> > [1] 4
> >
> > Any help would be appreciated.
> >
> > > version
> >         _
> > platform i386-pc-mingw32
> > arch     i386
> > os       mingw32
> > system   i386, mingw32
> > status
> > major    2
> > minor    2.1
> > year     2005
> > month    12
> > day      20
> > svn rev  36812
> > language R
> >
> > ______________________________________________
> > R-help at stat.math.ethz.ch mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > and provide commented, minimal, self-contained, reproducible code.
> >
>
>
> --
> Jim Holtman
> Cincinnati, OH
> +1 513 646 9390
>
> What is the problem you are trying to solve?
>

```