[R] R: cbind

Sundar Dorai-Raj sundar.dorai-raj at pdf.com
Mon Aug 8 13:13:16 CEST 2005



Clark Allan wrote:
> hi all
> 
> 
> are we able to combine column vectors of different lengths such that the
> result appears in matrix form?
> 
> e.g.
> 
> a=1
> b=1:3
> d=1:4
> 
> then
> 
> z=CBIND(a,b,d)
> 
> 
> 1 1 1
>   2 2
>   3 3
>     4
> 
> i stil want the following!
> z[,1]=1
> z[,2]=1:3
> z[,3]=1:5
> 
> i made up the name of this function. we could use "cbind" but it does
> not seem to allows this!
> 
> thanking you in advance.
> 
> /
> allan

Hi, Allan,

How about the following:

cbind.all <- function(..., fill.with = NA) {
   args <- list(...)
   len <- sapply(args, NROW)
   if(diff(rng <- range(len)) > 0) {
     maxlen <- rng[2]
     pad <- function(x, n) c(x, rep(fill.with, n))
     for(j in seq(along = args)) {
       if(maxlen == len[j]) next
       if(is.data.frame(args[[j]])) {
         args[[j]] <- lapply(args[[j]], pad, maxlen - len[j])
         args[[j]] <- as.data.frame(args[[j]])
       } else if(is.matrix(args[[j]])) {
         args[[j]] <- apply(args[[j]], 2, pad, maxlen - len[j])
       } else if(is.vector(args[[j]])) {
         args[[j]] <- pad(args[[j]], maxlen - len[j])
       } else {
         stop("... must only contain data.frames or arrays.")
       }
     }
   }
   do.call("cbind", args)
}

cbind.all(data.frame(a=1),
           data.frame(a=c(2,1)),
           x = 1, y = matrix(1:4,2,2))

cbind.all(a = 1, b = 1:3, d = 1:4)

HTH,

--sundar




More information about the R-help mailing list