Combinación de vectores (cbind) de diferente longitud

Tengo varios vectores de longitud desigual y me gustaría cbind . He puesto los vectores en una lista y he intentado combinar el uso de do.call(cbind, ...) :

 nm <- list(1:8, 3:8, 1:5) do.call(cbind, nm) # [,1] [,2] [,3] # [1,] 1 3 1 # [2,] 2 4 2 # [3,] 3 5 3 # [4,] 4 6 4 # [5,] 5 7 5 # [6,] 6 8 1 # [7,] 7 3 2 # [8,] 8 4 3 # Warning message: # In (function (..., deparse.level = 1) : # number of rows of result is not a multiple of vector length (arg 2) 

Como se esperaba, el número de filas en la matriz resultante es la longitud del vector más largo, y los valores de los vectores más cortos se reciclan para compensar la longitud.

En cambio, me gustaría rellenar los vectores más cortos con los valores NA para obtener la misma longitud que el vector más largo. Me gustaría que la matriz se viera así:

 # [,1] [,2] [,3] # [1,] 1 3 1 # [2,] 2 4 2 # [3,] 3 5 3 # [4,] 4 6 4 # [5,] 5 7 5 # [6,] 6 8 NA # [7,] 7 NA NA # [8,] 8 NA NA 

¿Cómo puedo hacer esto?

Puede usar indexación, si indexa un número más allá del tamaño del objeto, devuelve NA . Esto funciona para cualquier número arbitrario de filas definidas con foo :

 nm <- list(1:8,3:8,1:5) foo <- 8 sapply(nm, '[', 1:foo) 

EDITAR:

O en una línea usando el vector más grande como número de filas:

 sapply(nm, '[', seq(max(sapply(nm,length)))) 

Desde R 3.2.0 puede usar lengths ("obtener la longitud de cada elemento de una lista") en lugar de sapply(nm, length) :

 sapply(nm, '[', seq(max(lengths(nm)))) 

Debe llenar vectores con NA antes de llamar a do.call.

 nm <- list(1:8,3:8,1:5) max_length <- max(unlist(lapply(nm,length))) nm_filled <- lapply(nm,function(x) {ans <- rep(NA,length=max_length); ans[1:length(x)]<- x; return(ans)}) do.call(cbind,nm_filled) 

Esta es una versión más corta de la solución de Wojciech.

 nm <- list(1:8,3:8,1:5) max_length <- max(sapply(nm,length)) sapply(nm, function(x){ c(x, rep(NA, max_length - length(x))) }) 
    Intereting Posts