seleccionar listas leer funcion eliminar elementos data columnas r vector

listas - ¿Cómo cbind o rbind vectores de diferentes longitudes sin repetir los elementos de los vectores más cortos?



seleccionar columnas en r (3)

El truco es hacer que todas tus entradas tengan la misma longitud.

x <- 1:2 y <- 1:10 n <- max(length(x), length(y)) length(x) <- n length(y) <- n

Si desea que su salida sea una matriz, entonces cbind funciona, pero obtiene valores NA adicionales para rellenar el rectángulo.

cbind(x, y) x y [1,] 1 1 [2,] 2 2 [3,] NA 3 [4,] NA 4 [5,] NA 5 [6,] NA 6 [7,] NA 7 [8,] NA 8 [9,] NA 9 [10,] NA 10

Para deshacerse de las NA , la salida debe ser una lista.

Map(function(...) { ans <- c(...) ans[!is.na(ans)] }, as.list(x), as.list(y) ) [[1]] [1] 1 1 [[2]] [1] 2 2 [[3]] [1] 3 [[4]] [1] 4 [[5]] [1] 5 [[6]] [1] 6 [[7]] [1] 7 [[8]] [1] 8 [[9]] [1] 9 [[10]] [1] 10

EDITAR: He cambiado mapply(..., SIMPLIFY = FALSE) por Map .

cbind(1:2, 1:10) [,1] [,2] [1,] 1 1 [2,] 2 2 [3,] 1 3 [4,] 2 4 [5,] 1 5 [6,] 2 6 [7,] 1 7 [8,] 2 8 [9,] 1 9 [10,] 2 10

Quiero un resultado como el siguiente

[,1] [,2] [1,] 1 1 [2,] 2 2 [3,] 3 [4,] 4 [5,] 5 [6,] 6 [7,] 7 [8,] 8 [9,] 9 [10,] 10


Función de ayuda ...

bind.pad <- function(l, side="r", len=max(sapply(l,length))) { if (side %in% c("b", "r")) { out <- sapply(l, ''length<-'', value=len) } else { out <- sapply(sapply(sapply(l, rev), ''length<-'', value=len, simplify=F), rev)} if (side %in% c("r", "l")) out <- t(out) out }

Ejemplos:

> l <- lapply(c(3,2,1,2,3),seq) > lapply(c("t","l","b","r"), bind.pad, l=l, len=4) [[1]] [,1] [,2] [,3] [,4] [,5] [1,] NA NA NA NA NA [2,] 1 NA NA NA 1 [3,] 2 1 NA 1 2 [4,] 3 2 1 2 3 [[2]] [,1] [,2] [,3] [,4] [1,] NA 1 2 3 [2,] NA NA 1 2 [3,] NA NA NA 1 [4,] NA NA 1 2 [5,] NA 1 2 3 [[3]] [,1] [,2] [,3] [,4] [,5] [1,] 1 1 1 1 1 [2,] 2 2 NA 2 2 [3,] 3 NA NA NA 3 [4,] NA NA NA NA NA [[4]] [,1] [,2] [,3] [,4] [1,] 1 2 3 NA [2,] 1 2 NA NA [3,] 1 NA NA NA [4,] 1 2 NA NA [5,] 1 2 3 NA


Me encontré con un problema similar y me gustaría sugerirle una solución adicional que algunos, espero, puedan resultarle útiles. La solución es bastante sencilla y hace uso del paquete qpcR y la función cbind.na proporcionada.

Ejemplo

x <- 1:2 y <- 1:10 dta <- qpcR:::cbind.na(x, y)

Resultados

> head(dta) x y [1,] 1 1 [2,] 2 2 [3,] NA 3 [4,] NA 4 [5,] NA 5 [6,] NA 6

Comentarios laterales

Siguiendo el ejemplo original , los nombres de las columnas se pueden eliminar fácilmente:

colnames(dta) <- NULL

la operación produciría la salida deseada en su totalidad:

> head(dta) [,1] [,2] [1,] 1 1 [2,] 2 2 [3,] NA 3 [4,] NA 4 [5,] NA 5 [6,] NA 6