[R] Extract values from multiple lists
Jeff Newmiller
jdnewmil at dcn.davis.ca.us
Wed Dec 17 01:46:16 CET 2014
You are chasing ghosts of performance past, Denes. The data.frame
function causes no problems, and if it is used then the OP would not need
to presume they know the internal structure of the data frame.
See below. (I am using R3.1.2.)
a1 <- list(x = rnorm(1e6), y = rnorm(1e6))
a2 <- list(x = rnorm(1e6), y = rnorm(1e6))
a3 <- list(x = rnorm(1e6), y = rnorm(1e6))
# get names of the objects
out_names <- ls(pattern="a[[:digit:]]$")
# amount of memory allocated
gc(reset=TRUE)
# Explicitly call data frame
out2 <- data.frame( a1=a1[["x"]], a2=a2[["x"]], a3=a3[["x"]] )
# No copying.
gc()
# Your suggested retreival method
out3a <- lapply( lapply( out_names, get ), "[[", "x" )
names( out3a ) <- out_names
# The "obvious" way to finish the job works fine.
out3 <- do.call( data.frame, out3a )
# No copying... well, you do end up with a new list in out3, but the data
itself doesn't get copied.
gc()
On Tue, 16 Dec 2014, D?nes T?th wrote:
> On 12/16/2014 06:06 PM, SH wrote:
>> Dear List,
>>
>> I hope this posting is not redundant. I have several list outputs with the
>> same components. I ran a function with three different scenarios below
>> (e.g., scen1, scen2, and scen3,...,scenN). I would like to extract the
>> same components and group them as a data frame. For example,
>> pop.inf.r1 <- scen1[['pop.inf.r']]
>> pop.inf.r2 <- scen2[['pop.inf.r']]
>> pop.inf.r3 <- scen3[['pop.inf.r']]
>> ...
>> pop.inf.rN<-scenN[['pop.inf.r']]
>> new.df <- data.frame(pop.inf.r1, pop.inf.r2, pop.inf.r3,...,pop.inf.rN)
>>
>> My final output would be 'new.df'. Could you help me how I can do that
>> efficiently?
>
> If efficiency is of concern, do not use data.frame() but create a list and
> add the required attributes with data.table::setattr (the setattr function of
> the data.table package). (You can also consider creating a data.table instead
> of a data.frame.)
>
> # some largish lists
> a1 <- list(x = rnorm(1e6), y = rnorm(1e6))
> a2 <- list(x = rnorm(1e6), y = rnorm(1e6))
> a3 <- list(x = rnorm(1e6), y = rnorm(1e6))
>
> # amount of memory allocated
> gc(reset=TRUE)
>
> # get names of the objects
> out_names <- ls(pattern="a[[:digit:]]$")
>
> # create a list
> out <- lapply(lapply(out_names, get), "[[", "x")
>
> # note that no copying occured
> gc()
>
> # decorate the list
> data.table::setattr(out, "names", out_names)
> data.table::setattr(out, "row.names", seq_along(out[[1]]))
> class(out) <- "data.frame"
>
> # still no copy
> gc()
>
> # output
> head(out)
>
>
> HTH,
> Denes
>
>
>>
>> Thanks in advance,
>>
>> Steve
>>
>> P.S.: Below are some examples of summary outputs.
>>
>>
>>> summary(scen1)
>> Length Class Mode
>> aql 1 -none- numeric
>> rql 1 -none- numeric
>> alpha 1 -none- numeric
>> beta 1 -none- numeric
>> n.sim 1 -none- numeric
>> N 1 -none- numeric
>> n.sample 1 -none- numeric
>> n.acc 1 -none- numeric
>> lot.inf.r 1 -none- numeric
>> pop.inf.n 2000 -none- list
>> pop.inf.r 2000 -none- list
>> pop.decision.t1 2000 -none- list
>> pop.decision.t2 2000 -none- list
>> sp.inf.n 2000 -none- list
>> sp.inf.r 2000 -none- list
>> sp.decision 2000 -none- list
>>> summary(scen2)
>> Length Class Mode
>> aql 1 -none- numeric
>> rql 1 -none- numeric
>> alpha 1 -none- numeric
>> beta 1 -none- numeric
>> n.sim 1 -none- numeric
>> N 1 -none- numeric
>> n.sample 1 -none- numeric
>> n.acc 1 -none- numeric
>> lot.inf.r 1 -none- numeric
>> pop.inf.n 2000 -none- list
>> pop.inf.r 2000 -none- list
>> pop.decision.t1 2000 -none- list
>> pop.decision.t2 2000 -none- list
>> sp.inf.n 2000 -none- list
>> sp.inf.r 2000 -none- list
>> sp.decision 2000 -none- list
>>> summary(scen3)
>> Length Class Mode
>> aql 1 -none- numeric
>> rql 1 -none- numeric
>> alpha 1 -none- numeric
>> beta 1 -none- numeric
>> n.sim 1 -none- numeric
>> N 1 -none- numeric
>> n.sample 1 -none- numeric
>> n.acc 1 -none- numeric
>> lot.inf.r 1 -none- numeric
>> pop.inf.n 2000 -none- list
>> pop.inf.r 2000 -none- list
>> pop.decision.t1 2000 -none- list
>> pop.decision.t2 2000 -none- list
>> sp.inf.n 2000 -none- list
>> sp.inf.r 2000 -none- list
>> sp.decision 2000 -none- list
>>
>> [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help at 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.
>>
>
> ______________________________________________
> R-help at 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.
>
---------------------------------------------------------------------------
Jeff Newmiller The ..... ..... Go Live...
DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go...
Live: OO#.. Dead: OO#.. Playing
Research Engineer (Solar/Batteries O.O#. #.O#. with
/Software/Embedded Controllers) .OO#. .OO#. rocks...1k
More information about the R-help
mailing list