2017-10-16 1 views
2

Je cherche à additionner toutes les combinaisons possibles de lignes dans une matrice. Une fonction similaire à la fonction rowSums() mais au lieu de produire nrow() sommes, cela produirait nrow()^nrow() sommes.Comment faire une somme de toutes les combinaisons de lignes dans Matrix?

Par exemple:

set.seed(10) 
dummymat <- matrix(floor(runif(9, 0, 2)), nrow = 3, ncol = 3) 

produit la matrice:

 [,1] [,2] [,3] 
[1,] 1 1 0 
[2,] 0 0 0 
[3,] 0 0 1 

Pour trouver toutes les lignes somme possible de la matrice, pourrait écrire le code suivant très inefficace:

allrowsums <- c() 

for(i in 1:nrow(dummymat)) { 
    firstcolval <- dummymat[i,1] 
    for(j in 1:nrow(dummymat)) { 
    secondcolval <- dummymat[j,2] 
    for(k in 1:nrow(dummymat)) { 
     thirdcolval <- dummymat[k,3] 
     rowsum <- firstcolval + secondcolval + thirdcolval 
     allrowsums <- append(allrowsums,rowsum) 
    } 
} 
} 

Ce qui donne la sortie suivante:

[1] 2 2 3 1 1 2 1 1 2 1 1 2 0 0 1 0 0 1 1 1 2 0 0 1 0 0 1 

Quel code plus succinct pourrais-je écrire pour des matrices beaucoup plus grandes?

Répondre

4

Vous pouvez utiliser expand.grid pour créer une trame de données de toutes les combinaisons d'éléments de colonne. A partir de là, vous pouvez simplement appeler rowSums pour obtenir toutes les combinaisons de somme possibles.

rowSums(dummymat_expand) 

Édité pour répondre à la question. Pour appliquer du code aux matrices avec une longueur de colonne variable, notez que expand.grid peut prendre des vecteurs, des facteurs ou une liste en tant qu'entrées. Vous pouvez donc créer une liste d'éléments de colonne pour nourrir expand.grid

# create a list of column elements 
dummymat_column_list <- lapply(1:ncol(dummymat), function(x) dummymat[, x]) 
expand.grid(dummymat_column_list) 
+0

Merci pour ce @Djork, pouvez-vous penser à la façon de rendre la réponse dynamique, de telle sorte qu'il peut gérer une matrice d'une longueur de la colonne? (Et le code n'a pas besoin d'être ajusté à chaque fois). Pour une matrice de 100 colonnes, le code de cette réponse sera également assez long. –

+1

J'ai modifié la réponse pour répondre à votre question. Si cela fonctionne pour vous s'il vous plaît accepter la réponse pour le marquer à proximité. – Djork

+0

merci @Djork, désolé d'être un PITA, mais cette solution ne peut pas traiter avec des matrices plus grandes en raison de sa consommation de mémoire semble. Essayez par exemple 'dummymat <- matrice (floor (runif (5000, 0, 2)), nrow = 1000, ncol = 5)' –