Hi,

 p <- lapply(1:1e6, function(i)c(i, log2(i)))

 system.time(z1 <- t(sapply(p,function(x)x)))
#   user  system elapsed 
 # 2.568   0.048   2.619 
 system.time(z1 <- do.call(rbind,p))
#   user  system elapsed 
 # 4.000   0.052   4.060 
A.K.



----- Original Message -----
From: William Dunlap <wdun...@tibco.com>
To: R. Michael Weylandt <michael.weyla...@gmail.com>; arun 
<smartpink...@yahoo.com>
Cc: R help <r-help@r-project.org>; "s...@gnu.org" <s...@gnu.org>
Sent: Tuesday, December 4, 2012 6:28 PM
Subject: RE: [R] list to matrix?

> No need for all this (see solutions including mine already given) --
> but even without those, this is silly. An identity map is a real waste
> if you just want the simplification bit of sapply() -- you'd be much
> better just using simplify2array()

You are right that simplify2array(p) does everything that sapply(p,function(x)x)
does and does it more quickly and that matrix(unlist(p),nrow=2,byrow=TRUE)
is much faster than either:

  > p <- lapply(1:1e6, function(i)c(i, log2(i)))
  > system.time(z1 <- t(sapply(p,function(x)x)))
     user  system elapsed 
      1.2     0.0     1.2 
  > system.time(z2 <- t(simplify2array(p)))
     user  system elapsed 
      0.91    0.00    0.90 
  > system.time(z3 <- matrix(unlist(p), ncol=2, byrow=TRUE))
     user  system elapsed 
     0.04    0.00    0.04

You can also use vapply instead of sapply - it requires that you supply
the expect shape and type of FUN's output so it is doesn't have to figure
this out from looking at all the outputs of FUN: 
  > system.time(z4 <- t(vapply(p,FUN=function(x)x,FUN.VALUE=numeric(2))))
     user  system elapsed 
     0.56    0.00    0.56 

An advantage of vapply is that it stops in its tracks if FUN returns
an unexpected value.  sapply() and simplify2array() will silently give
you an unexpected result (a single column matrix of mode list 
instead of a vector of numbers)  and matrix(unlist()...) gives you a
warning if you are lucky.
  > pBad <- p ; pBad[[length(pBad)/2]] <- 666
  > system.time(zBad1 <- t(sapply(pBad,function(x)x)))
     user  system elapsed 
     1.75    0.00    1.75 
  > zBad1[,499999:500001] # not what we wanted
  [[1]]
  [1] 499999.00000     18.93157

  [[2]]
  [1] 666
  
  [[3]]
  [1] 500001.00000     18.93157
  > system.time(zBad2 <- t(simplify2array(pBad)))
     user  system elapsed 
      0.5     0.0     0.5 
  > system.time(zBad3 <- matrix(unlist(pBad), ncol=2, byrow=TRUE))
     user  system elapsed 
     0.03    0.00    0.03 
  Warning message:
  In matrix(unlist(pBad), ncol = 2, byrow = TRUE) :
    data length [1999999] is not a sub-multiple or multiple of the number of 
rows [1000000]
  > # no warning if length(unlist(p)) were even
  > system.time(zBad4 <- t(vapply(pBad,function(x)x,numeric(2))))
  Error in vapply(pBad, function(x) x, numeric(2)) : 
    values must be length 2,
   but FUN(X[[500000]]) result is length 1
  Timing stopped at: 0.29 0 0.28

Which of the latter two methods you choose depends on how likely errors
in the data are.

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com


> -----Original Message-----
> From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On 
> Behalf
> Of R. Michael Weylandt
> Sent: Tuesday, December 04, 2012 2:59 PM
> To: arun
> Cc: R help; s...@gnu.org
> Subject: Re: [R] list to matrix?
> 
> On Tue, Dec 4, 2012 at 8:17 PM, arun <smartpink...@yahoo.com> wrote:
> > Hi,
> > Try this:
> > list1<-list(c(50000, 101), c(1e+05, 46), c(150000, 31), c(2e+05, 17),
> >     c(250000, 19), c(3e+05, 11), c(350000, 12), c(4e+05, 25),
> >     c(450000, 19), c(5e+05, 16))
> >
> >
> > res<-t(sapply(list1,function(x) x))
> 
> Bah Humbug! (In Christmas cheer)
> 
> No need for all this (see solutions including mine already given) --
> but even without those, this is silly. An identity map is a real waste
> if you just want the simplification bit of sapply() -- you'd be much
> better just using simplify2array()
> 
> Michael
> 
> ______________________________________________
> R-help@r-project.org mailing list
> 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@r-project.org mailing list
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.

Reply via email to