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