how to combine vectors with different length within a list in R?

Julien picture Julien · Jan 5, 2012 · Viewed 9k times · Source

I have a problem when combining the following vectors included in the list:

x <- list(as.numeric(c(1,4)),as.numeric(c(3,19,11)))
names (x[[1]]) <- c("species.A","species.C")
names (x[[2]]) <- c("species.A","species.B","species.C")

which gives the following list:

>x
>[[1]]
>species.A species.C 
>         1         4 
>[[2]]
>species.A species.B species.C 
>        3        19        11 

combining them using the do.call function: y<- do.call(cbind,x)

gives:

>y
>             [,1] [,2]
>   species.A    1    3
>   species.B    4   19
>   species.C    1   11

while I would like to obtain this:

>             [,1] [,2]
>   species.A    1    3
>   species.B   NA   19
>   species.C    4   11

Answer

Josh O&#39;Brien picture Josh O'Brien · Jan 5, 2012

You need to give R a bit more help, by first preparing the particular vectors, all of the same length, that you eventually want to cbind together. Otherwise (as you've seen) R uses its usual recycling rules to fill out the matrix.

Try something like this:

spp <- paste("species", c("A", "B", "C"), sep=".")

x2 <- lapply(x, FUN=function(X) X[spp])
mat <- do.call("cbind", x2)
row.names(mat) <- spp

mat
          [,1] [,2]
species.A    1    3
species.B   NA   19
species.C    4   11

EDIT: As Brian mentions in comments, this could be made a bit more compact (but at the expense of some readability). Which one you use is just a matter of taste:

mat <- do.call("cbind", lapply(x, "[", spp))
row.names(mat) <- spp