Disons que j'ai deux matrices A et B avec les mêmes dimensions comme suit:
C = matrix(NA, nrow=3, ncol=20) j=1 for(i in 1:10){ C[,j] = A[,i] C[,j+1] = B[,i] j=j+2 }
Existe-t-il une fonction R pour concaténer ces deux matrices colonne par colonne pour obtenir une seule matrice comme suit ?
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [1,] 1 30 4 27 7 24 10 21 13 18 16 15 19 12 22 9 25 6 28 3 [2,] 2 29 5 26 8 23 11 20 14 17 17 14 20 11 23 8 26 5 29 2 [3,] 3 28 6 25 9 22 12 19 15 16 18 13 21 10 24 7 27 4 30 1
voici mon code, y a-t-il un moyen de l'optimiser?
A = matrix(1:30, nrow=3, ncol=10) B = matrix(30:1, nrow=3, ncol=10) #dim(A) = dim(B) #[1] 3 10 A [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 1 4 7 10 13 16 19 22 25 28 [2,] 2 5 8 11 14 17 20 23 26 29 [3,] 3 6 9 12 15 18 21 24 27 30 B [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 30 27 24 21 18 15 12 9 6 3 [2,] 29 26 23 20 17 14 11 8 5 2 [3,] 28 25 22 19 16 13 10 7 4 1
Merci
3 Réponses :
Vous pouvez cbind
les deux matrices puis sélectionner des colonnes alternées de la première moitié et de la seconde moitié de la matrice combinée:
mat <- cbind(A, B) inds <- (ncol(mat)/2) mat[, c(rbind(1:inds, (inds + 1):ncol(mat)))] # [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] #[1,] 1 30 4 27 7 24 10 21 13 18 16 #[2,] 2 29 5 26 8 23 11 20 14 17 17 #[3,] 3 28 6 25 9 22 12 19 15 16 18 # [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] #[1,] 15 19 12 22 9 25 6 28 3 #[2,] 14 20 11 23 8 26 5 29 2 #[3,] 13 21 10 24 7 27 4 30 1
Vous pouvez faire:
matrix(rbind(A,B), nrow=3, ncol=20)
Nous pouvons utiliser asplit
pour diviser les matrices en une liste
puis avec Map
, nous pouvons rbind
t(do.call(rbind, Map(rbind, asplit(A, 2), asplit(B, 2)))) #. [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] #[1,] 1 30 4 27 7 24 10 21 13 18 16 15 19 12 22 9 25 6 28 3 #[2,] 2 29 5 26 8 23 11 20 14 17 17 14 20 11 23 8 26 5 29 2 #[3,] 3 28 6 25 9 22 12 19 15 16 18 13 21 10 24 7 27 4 30 1
matrice (rbind (A, B), nrow = 3)