On Jan 11, 2012, at 1:40 PM, Chris Conner wrote:

> As a newer R practicioner, it seems I stump myself weekly (at least) with 
> issues that have spinning my wheels.  Here is yet another... I'm trying to 
> turn a list of numeric vectors (of uneual length) inot a dataframe.  Each 
> vector held in the list represents a row, and there are some rows of unequal 
> length.  I would like NAs as placeholders for "missing" data in the shorter 
> vectors.  I think I'm missing something quite basic.
>  
> v1 <- c(1,2,3,4)
> v2 <- c(1,2)
> lst1 <- list(v1,v2)
>  
> Of course there is the intuitive:
>  
> as.data.frame(lst1)
>  
> However, the recycling rule (expectedly) reclycles 1,2 versus using NAs as 
> placeholders.
>  
> Then, looking into Teetor's R Cookbook, there is a piece of code that looked 
> (from the description) like it might do the trick:
>  
> do.call(rbind, Map(as.data.frame,lst1)
>  
> But I get the error:
> Error in match.names(clabs, names(xi)) : 
>   names do not match previous names
>  
> Thinking the source of the error had to do with the vectors of unequal 
> lenght, I tried Hadley's rbind.fill thusly:
>  
> library(reshape)
> do.call(rbind.fill, Map(as.data.frame,lst1)
>  
> Which produced a dataset, but gain, not in the desired format.
>  
> Thanks in advance to anyone that can bring my frustrations to end!
> C
>       [[alternative HTML version deleted]]


There may be an easier way, but try this:

list2df <- function(x)
{
  MAX.LEN <- max(sapply(x, length), na.rm = TRUE)
  DF <- data.frame(lapply(x, function(x) c(x, rep(NA, MAX.LEN - length(x)))))
  colnames(DF) <- paste("V", seq(ncol(DF)), sep = "")  
  DF
}


> list2df(lst1)
  V1 V2
1  1  1
2  2  2
3  3 NA
4  4 NA


HTH,

Marc Schwartz

______________________________________________
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