[Résolu]Somme sur les lignes d'une matrice ?

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Abdel Zine
Messages : 75
Enregistré le : 28 Nov 2006, 09:56

[Résolu]Somme sur les lignes d'une matrice ?

Messagepar Abdel Zine » 30 Juin 2007, 11:13

Bonjour,

Soit la matrice (obtenue à partir d'un read.csv):
> mySAT
V1 V2
1 0 0
2 10 -9
3 5 5
4 0 0
5 0 0
Je construis somAllSAT pour contenir la somme des lignes de mySAT comme suit :

Code : Tout sélectionner

for(i in 1:ncol(mySAT))
{
somAllSAT <- somAllSAT + mySAT[i]
}
rownames(somAllSAT) <- paste("run.",1:nrow(somAllSAT),sep="")
colnames(somAllSAT) <- paste("somAllSAT")

J'obtiens :
>somAllSAT
somAllSAT
run.1 0
run.2 1
run.3 10
run.4 0
run.5 0
Je voudrais maintenant appliquer une restriction sur les lignes, de telle sorte à obtenir les lignes 2, 3 et 5, cette condition est donnée par la formule :

Code : Tout sélectionner

s < nbSteps - 1
[1] FALSE  TRUE  TRUE FALSE  TRUE
Si je procède par l'instruction suivante :

Code : Tout sélectionner

somConvSAT <- somAllSAT[s < nbSteps - 1,]

j'obtiens :
> somConvSAT
[1] 1 10 0

Or, je voudrais obtenir la même présentation de somAllSAT, telle que ci-dessous (que j'ai fait manuellement) :
somConvSAT
run.2 1
run.3 10
run.5 0
Comment obtenir cette dernière ?
Je sais que ça doit être relatif au type de la variable, mais je ne trouve pas comment faire.

Merci d'avance.

PS : Puis-je faire ce traitement (somme des lignes de la matrice) en utilisant apply sur la variable mySAT ?
Nul ne peut atteindre l'aube sans passer par le chemin de la nuit. Khalil Gibran.

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Re: Somme sur les lignes d'une matrice ?

Messagepar Renaud Lancelot » 30 Juin 2007, 14:54

Abdel Zine a écrit :Bonjour,

Soit la matrice (obtenue à partir d'un read.csv):

Code : Tout sélectionner

> mySAT
  V1 V2
1  0  0
2 10 -9
3  5  5
4  0  0
5  0  0


Il ne s'agit pas d'une matrice mais d'un data frame.

Je construis somAllSAT pour contenir la somme des lignes de mySAT comme suit :

Code : Tout sélectionner

for(i in 1:ncol(mySAT))
{
somAllSAT <- somAllSAT + mySAT[i]
}
rownames(somAllSAT) <- paste("run.",1:nrow(somAllSAT),sep="")
colnames(somAllSAT) <- paste("somAllSAT")

J'obtiens :

Code : Tout sélectionner

>somAllSAT
      somAllSAT
run.1         0
run.2         1
run.3        10
run.4         0
run.5         0


Vous vous compliquez la vie: la fonction rowSums fait déjà ça:

Code : Tout sélectionner

> (mySAT <- data.frame(V1 = c(0, 10, 5, 0, 0),
+                      V2 = c(0, -9, 5, 0, 0)))
  V1 V2
1  0  0
2 10 -9
3  5  5
4  0  0
5  0  0
> rowSums(mySAT)
[1]  0  1 10  0  0


Je voudrais maintenant appliquer une restriction sur les lignes, de telle sorte à obtenir les lignes 2, 3 et 5, cette condition est donnée par la formule :

Code : Tout sélectionner

s < nbSteps - 1
[1] FALSE  TRUE  TRUE FALSE  TRUE
Si je procède par l'instruction suivante :

Code : Tout sélectionner

somConvSAT <- somAllSAT[s < nbSteps - 1,]

j'obtiens :

Code : Tout sélectionner

> somConvSAT
[1]  1 10  0

Normal: il s'agit d'un vecteur.

Or, je voudrais obtenir la même présentation de somAllSAT, telle que ci-dessous (que j'ai fait manuellement) :

Code : Tout sélectionner

      somConvSAT
run.2         1
run.3        10
run.5         0
Comment obtenir cette dernière ?


Il suffit d'utiliser cbind, ou data.frame:

Code : Tout sélectionner

> cond <- c(FALSE, TRUE, TRUE, FALSE, TRUE)
>
> cbind(mySAT[cond, ], somme = rowSums(mySAT[cond, ]))
  V1 V2 somme
2 10 -9     1
3  5  5    10
5  0  0     0


Je sais que ça doit être relatif au type de la variable, mais je ne trouve pas comment faire.

Merci d'avance.

PS : Puis-je faire ce traitement (somme des lignes de la matrice) en utilisant apply sur la variable mySAT ?


Oui, mais rowSums (et colSums pour les colonnes) est plus rapide.

Code : Tout sélectionner

> apply(mySAT[cond, ], 1, sum)
 2  3  5
 1 10  0
>
> cbind(mySAT[cond, ], somme = apply(mySAT[cond, ], 1, sum))
  V1 V2 somme
2 10 -9     1
3  5  5    10
5  0  0     0


Renaud

Abdel Zine
Messages : 75
Enregistré le : 28 Nov 2006, 09:56

Messagepar Abdel Zine » 30 Juin 2007, 15:58

j'ai suivi vos conseils Renaud,c'est parfait.

Merci beaucoup !
Nul ne peut atteindre l'aube sans passer par le chemin de la nuit. Khalil Gibran.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité