Re: [R] R: cbind

From: Sundar Dorai-Raj <sundar.dorai-raj_at_pdf.com>
Date: Mon 08 Aug 2005 - 21:13:16 EST

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



R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html Received on Mon Aug 08 21:17:51 2005

This archive was generated by hypermail 2.1.8 : Sun 23 Oct 2005 - 15:08:59 EST