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 -- 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/20150116/6ea657ef/attachment.bin>
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. >
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. 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.
Chel Hee Lee <chl948 at mail.usask.ca> writes:> This approach may not be fancy as what you are looking for.As long as it works ans=d it is efficient, it is OK.> >> xl <- unlist(x)The unlist might be a problem as I am working with quite large lists.>> xl[grep("A", names(xl))]The grep has one problem, as it would also return fields which contain an "A", e.g. "Alpha". I am sure this could be fixed with a regular expression.> f1.x1.A f1.x2.A f2.x3.A f2.x4.A > 11 12 13 14 >> > > I hope this helps.Thanks, Rainer.> > 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. >> >-- 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/5759f43a/attachment.bin>