Question

Disons que j'ai une matrice x qui contient 10 lignes et 2 colonnes. Je souhaite générer une nouvelle matrice M contenant chaque paire unique de lignes de x , c'est-à-dire une nouvelle matrice de 55 lignes et 4 colonnes.

Par exemple,

x <- matrix (nrow=10, ncol=2, 1:20)

M <- data.frame(matrix(ncol=4, nrow=55))
k <- 1
for (i in 1:nrow(x))
for (j in i:nrow(x))
{
    M[k,] <- unlist(cbind (x[i,], x[j,]))
    k <- k + 1
}

Ainsi, x est:

      [,1] [,2]
 [1,]    1   11
 [2,]    2   12
 [3,]    3   13
 [4,]    4   14
 [5,]    5   15
 [6,]    6   16
 [7,]    7   17
 [8,]    8   18
 [9,]    9   19
[10,]   10   20

Et puis M a 4 colonnes, les deux premières sont une ligne de x et les 2 suivantes sont une autre ligne de x :

> head(M,10)
   X1 X2 X3 X4
1   1 11  1 11
2   1 11  2 12
3   1 11  3 13
4   1 11  4 14
5   1 11  5 15
6   1 11  6 16
7   1 11  7 17
8   1 11  8 18
9   1 11  9 19
10  1 11 10 20

Existe-t-il une méthode plus rapide ou plus simple (ou les deux) dans R?

Était-ce utile?

La solution

La fonction expand.grid () utile pour cela:

R> GG <- expand.grid(1:10,1:10)
R> GG <- GG[GG[,1]>=GG[,2],]     # trim it to your 55 pairs
R> dim(GG)
[1] 55  2
R> head(GG)
  Var1 Var2
1    1    1
2    2    1
3    3    1
4    4    1
5    5    1
6    6    1
R> 

Vous avez maintenant les sous-ensembles 'n * (n + 1) / 2' et vous pouvez simplement indexer votre matrice d'origine.

Autres conseils

Je ne suis pas très content de ce que vous faites, je vais juste jeter un truc qui pourrait ou ne pourrait pas aider.

Voici ce que je considère comme le produit cartésien des deux colonnes:

expand.grid(x[,1],x[,2])

Vous pouvez également essayer les " relations " paquet. Voici la vignette. Il devrait fonctionner comme ceci :

relation_table(x %><% x)

Utilisation de la réponse de Dirk:

idx <- expand.grid(1:nrow(x), 1:nrow(x))
idx<-idx[idx[,1] >= idx[,2],]
N <- cbind(x[idx[,2],], x[idx[,1],])

> all(M == N)
[1] TRUE

Merci à tous!

Inspiré des autres réponses, voici une fonction implémentant le produit cartésien de deux matrices, dans le cas de deux matrices, le produit cartésien complet, pour un seul argument, en omettant un de chaque paire:

cartesian_prod <- function(M1, M2) {
if(missing(M2)) {  M2 <- M1
     ind  <- expand.grid(1:NROW(M1), 1:NROW(M2))
     ind <- ind[ind[,1] >= ind[,2],] } else {
                                          ind  <- expand.grid(1:NROW(M1), 1:NROW(M2))}
rbind(cbind(M1[ind[,1],], M2[ind[,2],]))

}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top