vectores significa que matrices linealmente lineal independientes independencia expresar ejemplos como combinacion list r merge matrix

list - significa - Combinación de vectores(cbind) de diferente longitud



vectores linealmente independientes (3)

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)

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?


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))) })


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))))