[R] List of lists to data frame?

Sarah Goslee sarah.goslee at gmail.com
Thu Nov 17 03:53:24 CET 2011


On Wed, Nov 16, 2011 at 9:39 PM, Kevin Burton <rkevinburton at charter.net> wrote:
> Say I have the following data:
>
>> s <- list()
>> s[["A"]] <- list(name="first", series=ts(rnorm(50), frequency=10,
> start=c(2000,1)), category="top")
>> s[["B"]] <- list(name="second", series=ts(rnorm(60), frequency=10,
> start=c(2000,2)), category="next")
>
> If I use unlist since this is a list of lists I don't end up with a data
> frame. And the number of rows in the data frame should equal the number of
> time series entries. In the sample above it would be 110. I would expect
> that the name and category strings would be recycled for each row. My brute
> force code attempts to build the data frame by appending to the master data
> frame but like I said it is *very* slow.

Appending is very slow, and should be avoided. Instead, create a data frame
of the correct size before starting the loop, and add each new bit into the
appropriate place.

There may well be a more efficient solution (I don't quite understand
what your objective is), but simply getting rid of the rbind() within a
loop will help.


> Kevin
>
> -----Original Message-----
> From: R. Michael Weylandt [mailto:michael.weylandt at gmail.com]
> Sent: Wednesday, November 16, 2011 5:26 PM
> To: rkevinburton at charter.net
> Cc: r-help at r-project.org
> Subject: Re: [R] List of lists to data frame?
>
> unlist(..., recursive = F)
>
> Michael
>
> On Wed, Nov 16, 2011 at 6:20 PM,  <rkevinburton at charter.net> wrote:
>>
>> I would like to make the following faster:
>>
>>        df <- NULL
>>        for(i in 1:length(s))
>>        {
>>                df <- rbind(df, cbind(names(s[i]), time(s[[i]]$series),
>> as.vector(s[[i]]$series), s[[i]]$category))
>>        }
>>        names(df) <- c("name", "time", "value", "category")
>>        return(df)
>>
>> The s object is a list of lists. It is constructed like:
>>
>> s[["object"]] <- list(. . . . . .)
>>
>> where "object" would be the name associated with this list
>> s[[i]]$series is a 'ts' object and s[[i]]$category is a name.
>>
>> Constructing this list is reasonably fast but to do some more
>> processing on the data it would be easier if it were converted to a data
> frame.
>> Right now the above code is unacceptably slow at converting this list
>> of lists to a data frame. Any suggestions on how to optimize this are
>> welcome.
>>
>> Thank you.
>>
>> Kevin

-- 
Sarah Goslee
http://www.functionaldiversity.org



More information about the R-help mailing list