[R] flatten a list of lists

Michael Friendly friendly at yorku.ca
Thu Oct 17 16:42:06 CEST 2013


Thanks to all who replied.

Here are two versions of a function (sans sanity checks) that do what I 
want:

foo1 <- multifoo(1:2, "A")
foo2 <- multifoo(1:2, "B")

mfoo <- list(A=foo1, B=foo2)
class(mfoo) <- c("foolist", "list")

#' flatten a list of lists

# from Duncan Murdoch
flatten <- function(list, unname=TRUE) {
     res <- do.call(c, if(unname) unname(list) else list)
     class(res) <- class(list)
     res
}

# from David Carlson
flatten2 <- function(list, unname=TRUE) {
     res <- unlist(list, recursive = FALSE)
     if(unname) names(res) <- unlist(lapply(list, names))
     class(res) <- class(list)
     res
}

mflat1 <- flatten(mfoo)
mflat2 <- flatten2(mfoo)
all.equal(mflat1,mflat2)

 > all.equal(mflat1,mflat2)
[1] TRUE

-Michael

On 10/17/2013 9:39 AM, David Carlson wrote:
> Does this get you the rest of the way?
>
>> mfoo2 <- unlist(mfoo, recursive = FALSE)
>> names(mfoo2) <- unlist(lapply(mfoo, names))
>> class(mfoo2) <- "foolist"
>> str(mfoo2)
> List of 4
>   $ A1:List of 2
>    ..$ x: int 3
>    ..$ y: int 10
>    ..- attr(*, "class")= chr "foo"
>   $ A2:List of 2
>    ..$ x: int [1:2] 6 4
>    ..$ y: int [1:2] 8 9
>    ..- attr(*, "class")= chr "foo"
>   $ B1:List of 2
>    ..$ x: int 2
>    ..$ y: int 2
>    ..- attr(*, "class")= chr "foo"
>   $ B2:List of 2
>    ..$ x: int [1:2] 3 6
>    ..$ y: int [1:2] 4 2
>    ..- attr(*, "class")= chr "foo"
>   - attr(*, "class")= chr "foolist"
>
> -------------------------------------
> David L Carlson
> Department of Anthropology
> Texas A&M University
> College Station, TX 77840-4352
>
>
>
>
> -----Original Message-----
> From: r-help-bounces at r-project.org
> [mailto:r-help-bounces at r-project.org] On Behalf Of Ista Zahn
> Sent: Thursday, October 17, 2013 8:23 AM
> To: Michael Friendly
> Cc: R-help
> Subject: Re: [R] flatten a list of lists
>
> unlist(mfoo, recursive = FALSE) gets you pretty close.
>
> Best,
> Ista
>
> On Thu, Oct 17, 2013 at 9:15 AM, Michael Friendly
> <friendly at yorku.ca> wrote:
>> I have functions that generate lists objects of class "foo"
> and lists of
>> lists of these, of class
>> "foolist", similar to what is shown below.
>>
>> How can I flatten something like this to remove the top-level
> list
>> structure, i.e.,
>> return a single-level list of "foo" objects, of class
> "foolist"?
>> foo <- function(n) {
>>      result <- list(x=sample(1:10,n), y=sample(1:10,n))
>>      class(result) <- "foo"
>>      result
>> }
>>
>> multifoo <- function(vec, label, ...) {
>>      result <- lapply(vec, foo, ...)
>>      names(result) <- paste0(label, vec)
>>      class(result) <- "foolist"
>>      result
>> }
>>
>> foo1 <- multifoo(1:2, "A")
>> foo2 <- multifoo(1:2, "B")
>>
>> mfoo <- list(A=foo1, B=foo2)
>>
>> str(mfoo, 2)
>>
>>> str(mfoo, 2)
>> List of 2
>>   $ A:List of 2
>>    ..$ A1:List of 2
>>    .. ..- attr(*, "class")= chr "foo"
>>    ..$ A2:List of 2
>>    .. ..- attr(*, "class")= chr "foo"
>>    ..- attr(*, "class")= chr "foolist"
>>   $ B:List of 2
>>    ..$ B1:List of 2
>>    .. ..- attr(*, "class")= chr "foo"
>>    ..$ B2:List of 2
>>    .. ..- attr(*, "class")= chr "foo"
>>    ..- attr(*, "class")= chr "foolist"
>>
>> In this case, what is wanted is a single-level list, of 4 foo
> objects, A1,
>> A2, B1, B2,
>> all of class "foolist"
>>
>> --
>> Michael Friendly     Email: friendly AT yorku DOT ca
>> Professor, Psychology Dept. & Chair, Quantitative Methods
>> York University      Voice: 416 736-2100 x66249 Fax: 416
> 736-5814
>> 4700 Keele Street    Web:   http://www.datavis.ca
>> Toronto, ONT  M3J 1P3 CANADA
>>
>> ______________________________________________
>> R-help at r-project.org 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 at r-project.org 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.
>


-- 
Michael Friendly     Email: friendly AT yorku DOT ca
Professor, Psychology Dept. & Chair, Quantitative Methods
York University      Voice: 416 736-2100 x66249 Fax: 416 736-5814
4700 Keele Street    Web:   http://www.datavis.ca
Toronto, ONT  M3J 1P3 CANADA



More information about the R-help mailing list