[R] Extracting elements out of list in list in list
Brian Diggs
brian.s.diggs at gmail.com
Fri Jan 16 23:08:23 CET 2015
On 1/16/15 9:34 AM, Bert Gunter wrote:
> Chee Hee's approach is both simpler and almost surely more efficient,
> 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
>
>> 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.
I don't know if you would consider this "slicker" or not, but it does
not give a lot of NULLs that have to be filtered out. It does so by
checking if the component of the list is itself a list before
recursively calling extr on it, and by using unlist internally.
extr <- function(x, nm) {
if(is.list(x)) {
sublists <- sapply(x, is.list)
c(unlist(x[nm]), unlist(sapply(x[sublists], extr, nm)))
} else {
message("Argument is not a list")
NULL
}
}
Running it on x gives
> extr(x, "A")
[1] 11 12 13 14
> 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
More information about the R-help
mailing list