[R] as.data.frame(do.call(rbind,lapply)) produces something weird

Sam Steingold sds at gnu.org
Fri Nov 9 20:21:39 CET 2012


The following code:
--8<---------------cut here---------------start------------->8---
> myfun <- function (x) list(x=x,y=x*x)
> z <- as.data.frame(do.call(rbind,lapply(1:3,function(x) c(a=paste("a",x,sep=""),as.list(unlist(list(b=myfun(x),c=myfun(x*x*x))))))))
> z
   a b.x b.y c.x c.y
1 a1   1   1   1   1
2 a2   2   4   8  64
3 a3   3   9  27 729
--8<---------------cut here---------------end--------------->8---
the appearance of z is good, but str() and summary betray some weirdness:
--8<---------------cut here---------------start------------->8---
> str(z)
'data.frame':	3 obs. of  5 variables:
 $ a  :List of 3
  ..$ : chr "a1"
  ..$ : chr "a2"
  ..$ : chr "a3"
 $ b.x:List of 3
  ..$ : int 1
  ..$ : int 2
  ..$ : int 3
 $ b.y:List of 3
  ..$ : int 1
  ..$ : int 4
  ..$ : int 9
 $ c.x:List of 3
  ..$ : int 1
  ..$ : int 8
  ..$ : int 27
 $ c.y:List of 3
  ..$ : int 1
  ..$ : int 64
  ..$ : int 729
--8<---------------cut here---------------end--------------->8---
how do I ensure that the columns of z are vectors, as in
--8<---------------cut here---------------start------------->8---
> z <- data.frame(a=c("a1","a2","a3"),b.x=c(1,2,3),b.y=c(1,4,9),c.x=c(1,8,27),c.y=c(1,64,729))
> z
   a b.x b.y c.x c.y
1 a1   1   1   1   1
2 a2   2   4   8  64
3 a3   3   9  27 729
> str(z)
'data.frame':	3 obs. of  5 variables:
 $ a  : Factor w/ 3 levels "a1","a2","a3": 1 2 3
 $ b.x: num  1 2 3
 $ b.y: num  1 4 9
 $ c.x: num  1 8 27
 $ c.y: num  1 64 729
--8<---------------cut here---------------end--------------->8---
thanks!

-- 
Sam Steingold (http://sds.podval.org/) on Ubuntu 12.04 (precise) X 11.0.11103000
http://www.childpsy.net/ http://jihadwatch.org http://think-israel.org
http://www.PetitionOnline.com/tap12009/ http://honestreporting.com
Programming is like sex: one mistake and you have to support it for a lifetime.



More information about the R-help mailing list