[R] Converting a list to a data frame

Martin Maechler m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Thu May 3 09:59:07 CEST 2018


>>>>> David L Carlson <dcarlson using 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


> -----Original Message-----
> From: R-help <r-help-bounces using r-project.org> On Behalf Of David L Carlson
> Sent: Wednesday, May 2, 2018 3:51 PM
> To: William Dunlap <wdunlap using tibco.com>; Kevin E. Thorpe <kevin.thorpe using utoronto.ca>
> Cc: r-help mailing list <r-help using 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 using 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 using utoronto.ca>
> Cc: R Help Mailing List <r-help using 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 using 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 using utoronto.ca  Tel: 416.864.5776  Fax: 416.864.3016
> >
> ______________________________________________
> R-help using 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.




More information about the R-help mailing list