Domanda

Diciamo che ho una matrice x che contiene 10 righe e 2 colonne. Voglio generare una nuova matrice M che contiene ogni coppia unica di righe da x , ovvero una nuova matrice con 55 righe e 4 colonne.

per es.,

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
}

Quindi, x è:

      [,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

E poi M ha 4 colonne, le prime due sono una riga da x e le successive 2 sono un'altra riga da 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

Esiste un modo più veloce o più semplice (o entrambi) per farlo in R?

È stato utile?

Soluzione

La funzione expand.grid () utile per questo:

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> 

Ora hai i sottoinsiemi 'n * (n + 1) / 2' e puoi semplicemente indicizzare la tua matrice originale.

Altri suggerimenti

Non sto abbastanza facendo trekking che cosa stai facendo, quindi lancerò semplicemente qualcosa che potrebbe o potrebbe non aiutare.

Ecco quello che penso come il prodotto cartesiano delle due colonne:

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

Puoi anche provare le " relazioni " pacchetto. Ecco la vignetta. Dovrebbe funzionare così :

relation_table(x %><% x)

Usando la risposta di 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

Grazie a tutti!

Ispirato alle altre risposte, ecco una funzione che implementa il prodotto cartesiano di due matrici, nel caso di due matrici, il prodotto cartesiano completo, per un solo argomento, omettendo una di ciascuna coppia:

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],]))

}

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top