[R] Converting a list to a data frame

Kevin E. Thorpe kevin@thorpe @ending from utoronto@c@
Thu May 3 12:47:45 CEST 2018


On 05/03/2018 03:59 AM, Martin Maechler wrote:
>>>>>> David L Carlson <dcarlson at tamu.edu>
>>>>>>      on Wed, 2 May 2018 21:43:52 +0000 writes:
> 
>> Typo: dat[[z]] should be x[[z]]:
>>
>> x2 <- do.call(rbind, lapply(names(x), function(z)
>>                              data.frame(type=z, x[[z]])))
>> x2
>>    type x y
>> 1    A 1 3
>> 2    A 2 4
>> 3    B 5 7
>> 4    B 6 8
>>
>> David C
> 
> Before this thread gets carried away to data.table and
> tibbleverse (and as nobody else has done so) :
> 
> Let me nominate this beautiful solution by
> Bill Dunlap and David Carlson to win the prize  with a 10 out 10 grade:
> 
> Beautiful use of  do.call() and lapply(), two of the most
> versatile and important functions from the base R toolbox.
> 
> Congratulations!
> 
> Martin Maechler
> R Core Team

First of all, thank you to all who responded. I have learned (and will 
learn) about several new things. The data.table/tibbleverse is one of 
those places I have yet to tread but it never seems to be a "good" time 
to learn as generally when these tools would be helpful is when I am 
trying to get something done but don't have the time to recast the 
problem in a different paradigm.

Second, I echo Martin's comment. The combined solution of Bill Dunlap 
and David Carlson is beautifully elegant.

Thanks again,

Kevin

> 
>> -----Original Message-----
>> From: R-help <r-help-bounces at r-project.org> On Behalf Of David L Carlson
>> Sent: Wednesday, May 2, 2018 3:51 PM
>> To: William Dunlap <wdunlap at tibco.com>; Kevin E. Thorpe <kevin.thorpe at utoronto.ca>
>> Cc: r-help mailing list <r-help at r-project.org>
>> Subject: Re: [R] Converting a list to a data frame
>>
>> Or add the type column first and then rbind:
>>
>> x <- list(A=data.frame(x=1:2, y=3:4),B=data.frame(x=5:6,y=7:8))
>> x2 <- do.call(rbind, lapply(names(x), function(z)
>>        data.frame(type=z, dat[[z]])))
>>
>> ----------------------------------------
>> David L Carlson
>> Department of Anthropology
>> Texas A&M University
>> College Station, TX 77843-4352
>>
>> -----Original Message-----
>> From: R-help <r-help-bounces at r-project.org> On Behalf Of William Dunlap via R-help
>> Sent: Wednesday, May 2, 2018 12:28 PM
>> To: Kevin E. Thorpe <kevin.thorpe at utoronto.ca>
>> Cc: R Help Mailing List <r-help at r-project.org>
>> Subject: Re: [R] Converting a list to a data frame
>>
>>> x1 <- do.call(rbind, c(x, list(make.row.names=FALSE)))
>>> x2 <- cbind(type=rep(names(x), vapply(x, nrow, 0)), x1)
>>> str(x2)
>> 'data.frame':   4 obs. of  3 variables:
>>   $ type: Factor w/ 2 levels "A","B": 1 1 2 2
>>   $ x   : int  1 2 5 6
>>   $ y   : int  3 4 7 8
>>
>>
>> Bill Dunlap
>> TIBCO Software
>> wdunlap tibco.com
>>
>> On Wed, May 2, 2018 at 10:11 AM, Kevin E. Thorpe <kevin.thorpe at utoronto.ca>
>> wrote:
>>
>>> I suspect this is pretty easy, but I'm having trouble figuring it out.
>>> Basically, I have a list of data frames such as the following example:
>>>
>>> list(A=data.frame(x=1:2, y=3:4),B=data.frame(x=5:6,y=7:8))
>>>
>>> I would like to turn this into  data frame where the list elements are
>>> essentially rbind'ed together and the element name becomes a new variable.
>>> For example, I would like to turn the list above into a data frame
>>> that looks like this:
>>>
>>> data.frame(type=c("A","A","B","B"),x=c(1:2,5:6),y=c(3:4,7:8))
>>>
>>> Appreciate any pointers.
>>>
>>> Kevin
>>>


-- 
Kevin E. Thorpe
Head of Biostatistics,  Applied Health Research Centre (AHRC)
Li Ka Shing Knowledge Institute of St. Michael's Hospital
Assistant Professor, Dalla Lana School of Public Health
University of Toronto
email: kevin.thorpe at utoronto.ca  Tel: 416.864.5776  Fax: 416.864.3016




More information about the R-help mailing list