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

xpRt.wannabe xprt.wannabe at gmail.com
Sat Aug 26 18:37:32 CEST 2006

```Thank you!

On 8/26/06, Patrick Burns <pburns at pburns.seanet.com> wrote:
>  > sub.m <- lapply(m, function(x)x[x>2])
>  > sub.m
> [[1]]
> [1] 3 4
>
> [[2]]
> [1] 4 5
>
> [[3]]
> [1] 4
>
>  > sub.m[unlist(lapply(sub.m, function(x) length(x) == 2))]
> [[1]]
> [1] 3 4
>
> [[2]]
> [1] 4 5
>
>  > sub4.m <- lapply(m, function(x)x[x>4])
>  > sub4.m[unlist(lapply(sub4.m, function(x) length(x) > 0))]
> [[1]]
> [1] 5
>
>
> Patrick Burns
> patrick at burns-stat.com
> +44 (0)20 8525 0696
> http://www.burns-stat.com
> (home of S Poetry and "A Guide for the Unwilling S User")
>
> xpRt.wannabe wrote:
>
> >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?
> >>>
> >>>
> >>>
> >
> >______________________________________________
> >R-help at stat.math.ethz.ch mailing list
> >https://stat.ethz.ch/mailman/listinfo/r-help