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

xpRt.wannabe xprt.wannabe at gmail.com
Sat Aug 26 07:36:32 CEST 2006

```Yet another question:

Let's say I do the following:

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

'sub.m' gives me:

[[1]]
[1] 3 4

[[2]]
[1] 4 5

[[3]]
[1] 4

The question is:  What do I need to do such that I can extract
componets of length 2 in 'sub.m' into another sublist, which would
look like this:

[[1]]
[1] 3 4

[[2]]
[1] 4 5

I think that's all the questions I can think of -- for now.

Many, many thanks!!!

On 8/25/06, xpRt. wannabe <xprt.wannabe at gmail.com> wrote:
> 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?
> >
>

```