[R] Extracting elements out of list in list in list

Rainer M Krug Rainer at krugs.de
Mon Jan 19 10:36:49 CET 2015


Bert Gunter <gunter.berton at gene.com> writes:

> Chee Hee's approach is both simpler and almost surely more efficient,

I am not sure about the efficient - if the lists are large, they need to
be copied and "un-listed" which both require memory allocations and
processing time - so I would actually guess that your (and Brian's) are
more efficient as they only work on the names of the original list.

> but I wanted to show another that walks the tree (i.e. the list)
> directly using recursion at the R level to pull out the desired
> components. This is in keeping with R's "functional" programming
> paradigm and avoids the use of regular expressions to extract the
> desired components from the unlist() version.
>
> extr <- function(x,nm){
>   if(is.recursive(x)){
>     wh <- names(x) %in% nm
>     c(x[wh],lapply(x[!wh],extr,nm=nm) )
>   } else NULL
> }
>
> ## The return value contains a bunch of NULLs; so use unlist() to remove them

NULLs can be dealt with - what I like in this is that the name of the
value reflects the path to the value in the list.

>
>> unlist(extr(x,"A"))
> f1.x1.A f1.x2.A f2.x3.A f2.x4.A
>      11      12      13      14
>
>
> I would welcome any possibly "slicker" versions of the above.

Thanks - this looks neat,

Rainer

>
> Cheers,
> Bert
>
> Bert Gunter
> Genentech Nonclinical Biostatistics
> (650) 467-7374
>
> "Data is not information. Information is not knowledge. And knowledge
> is certainly not wisdom."
> Clifford Stoll
>
>
>
>
> On Fri, Jan 16, 2015 at 7:23 AM, Chel Hee Lee <chl948 at mail.usask.ca> wrote:
>> This approach may not be fancy as what you are looking for.
>>
>>> xl <- unlist(x)
>>> xl[grep("A", names(xl))]
>> f1.x1.A f1.x2.A f2.x3.A f2.x4.A
>>      11      12      13      14
>>>
>>
>> I hope this helps.
>>
>> Chel Hee Lee
>>
>> On 01/16/2015 04:40 AM, Rainer M Krug wrote:
>>>
>>> Hi
>>>
>>> Consider the following variable:
>>>
>>> --8<---------------cut here---------------start------------->8---
>>> x1 <- list(
>>>    A = 11,
>>>    B = 21,
>>>    C = 31
>>> )
>>>
>>> x2 <- list(
>>>    A = 12,
>>>    B = 22,
>>>    C = 32
>>> )
>>>
>>> x3 <- list(
>>>    A = 13,
>>>    B = 23,
>>>    C = 33
>>> )
>>>
>>> x4 <- list(
>>>    A = 14,
>>>    B = 24,
>>>    C = 34
>>> )
>>>
>>> y1 <- list(
>>>    x1 = x1,
>>>    x2 = x2
>>> )
>>>
>>> y2 <- list(
>>>    x3 = x3,
>>>    x4 = x4
>>> )
>>>
>>> x <- list(
>>>    f1 = y1,
>>>    f2 = y2
>>> )
>>> --8<---------------cut here---------------end--------------->8---
>>>
>>>
>>> To extract all fields named "A" from y1, I can do
>>>
>>> ,----
>>> | > sapply(y1, "[[", "A")
>>> | x1 x2
>>> | 11 12
>>> `----
>>>
>>> But how can I do the same for x?
>>>
>>> I could put an sapply into an sapply, but this would be less then
>>> elegant.
>>>
>>> Is there an easier way of doing this?
>>>
>>> Thanks,
>>>
>>> Rainer
>>>
>>>
>>>
>>> ______________________________________________
>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>> 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 at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> 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.
>

-- 
Rainer M. Krug
email: Rainer<at>krugs<dot>de
PGP: 0x0F52F982
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 494 bytes
Desc: not available
URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20150119/51e82764/attachment.bin>


More information about the R-help mailing list