Converting a list to a data frame
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