Comment relier ou relier des vecteurs de différentes longueurs sans répéter les éléments des vecteurs plus courts?

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 

Je veux une sortie comme ci-dessous

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

L’astuce consiste à rendre toutes vos entrées de la même longueur.

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

Si vous voulez que votre sortie soit un tableau, alors cbind fonctionne, mais vous obtenez des valeurs NA supplémentaires pour remplir le rectangle.

 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 

Pour se débarrasser des NA , le résultat doit être une liste.

 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: J'ai échangé mapply(..., SIMPLIFY = FALSE) pour Map .

J’ai rencontré un problème similaire et je voudrais suggérer cette solution supplémentaire que certains, je l’espère, pourraient trouver utile. La solution est assez simple et utilise le package qpcR et la fonction cbind.na fournie.

Exemple

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

Résultats

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

Commentaires secondaires

Suivant l'exemple original de l' OP , les noms de colonne peuvent être facilement supprimés:

 colnames(dta) <- NULL 

l'opération produirait l'intégralité de la sortie souhaitée:

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

Fonction d’aide …

 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 } 

Exemples:

 > 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