[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