Como cbind ou rbind diferentes vetores de comprimentos sem repetir os elementos dos vetores mais curtos?

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 

Eu quero uma saída como abaixo

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

O truque é fazer com que todas as suas inputs tenham o mesmo tamanho.

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

Se você quiser que a saída seja um array, então o cbind funciona, mas você recebe valores NA adicionais para preencher o retângulo.

 cbind(x, y) xy [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 se livrar dos NA , a saída deve ser uma 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 

EDIT: eu troquei mapply(..., SIMPLIFY = FALSE) para o Map .

Me deparei com um problema semelhante e gostaria de sugerir uma solução adicional que, espero, possa ser útil. A solução é bastante simples e faz uso do pacote qpcR e da function cbind.na fornecida.

Exemplo

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

Resultados

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

Comentários laterais

Seguindo o exemplo original do OP , os nomes das colunas podem ser facilmente removidos:

 colnames(dta) < - NULL 

a operação produziria a saída desejada na totalidade:

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

Função auxiliar …

 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 } 

Exemplos:

 > 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