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

From: Patrick Burns <pburns_at_pburns.seanet.com>
Date: Sat 26 Aug 2006 - 18:57:17 EST

 > 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@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@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@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@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@stat.math.ethz.ch mailing list
>>>>https://stat.ethz.ch/mailman/listinfo/r-help
>>>>PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>>>>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@stat.math.ethz.ch mailing list
>https://stat.ethz.ch/mailman/listinfo/r-help
>PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>and provide commented, minimal, self-contained, reproducible code.
>
>
>
>



R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Sat Aug 26 19:03:49 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Sun 27 Aug 2006 - 10:22:36 EST.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.