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

jim holtman jholtman at gmail.com
Fri Nov 9 21:58:40 CET 2012


This is a case where you start by breaking down you complex one-liner
into separate statements and examine what the results are at each
point.  This is what I would have to do with the script you posted.

I think as Bill pointed out, one of your function calls is probably
creating a result that you were not expecting.  Standard (good)
programming practice would have you creating a number of simple
statements; this allows ease of debugging.

On Fri, Nov 9, 2012 at 2:21 PM, Sam Steingold <sds at gnu.org> wrote:
> 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.
>
> ______________________________________________
> R-help at 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.



-- 
Jim Holtman
Data Munger Guru

What is the problem that you are trying to solve?
Tell me what you want to do, not how you want to do it.




More information about the R-help mailing list