Bert Gunter <gunter.ber...@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 <chl...@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@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@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
signature.asc
Description: PGP signature
______________________________________________ R-help@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.