Moyenne par ligne et boucle for

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

Jennifer Nacef
Messages : 28
Enregistré le : 24 Fév 2015, 08:53

Moyenne par ligne et boucle for

Messagepar Jennifer Nacef » 16 Sep 2015, 11:29

Bonjour,

Je me retrouve face à un problème avec une boucle for.

Je vous explique grossièrement mon jeu de données (mais je ne pense pas qu'il soit nécessaire à la résolution de mon problème)
J'ai un tableau (que j'appelle tab) qui possède en l’occurrence 12 colonnes avec un nombre variable de lignes. Les colonnes plus courtes que les autres sont complétées par des NA, la colonne la plus longue a 135 lignes (donc on peut dire que mon tableau a 135 lignes quoi).
Je souhaite obtenir dans un nouveau tableau (tab.final) une colonne avec la moyenne de chaque ligne pour les colonnes 1 à 8 et une autre avec les colonnes 9 à 12.

Mon tab.final devrait donc avec 135 lignes et 2 colonnes. Mais j'obtiens ceci :

Code : Tout sélectionner

> for(i in 1:135)  {
+ tab.final <- cbind ( rbind(mean(tab[i,1:8],na.rm=TRUE)), #moyenne avant
+                      rbind(mean(tab[i,9:12],na.rm=TRUE))) #moyenne apres
+ }

> tab.final
      [,1] [,2]
[1,] 7.079  NaN


J'ai essayé la fonction rowMeans mais sans succès, j'obtiens un tableau à 1 ligne et 270 colonnes .... :/

Code : Tout sélectionner

> tab.final <- cbind ( rbind(rowMeans(tab[,1:8],na.rm=TRUE)), #moyenne avant
+                      rbind(rowMeans(tab[,9:12],na.rm=TRUE))) #moyenne apres



Quelqu'un voit-il le problème dans mon code ? Si vous avez besoin de données n'hésitez pas mais je ne pensais pas nécessaire de charger ce post avec mes données.

Merci d'avance

Jennifer

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Moyenne par ligne et boucle for

Messagepar Serge Rapenne » 16 Sep 2015, 11:54

Bonjour,

La boucle est inutile, c'est pour ce genre de calcul que la vectorisation dans R est incomparable. Et effectivement rowMeans est une solution possible.

Code : Tout sélectionner

tab.final<-data.frame(moyenne1=rowMeans(tab[,1:8],na.rm=TRUE),moyenne2=rowMeans(tab[,9:12],na.rm=TRUE))



Edit : sinon tu y était presque

Code : Tout sélectionner

tab.final <- cbind(rowMeans(tab[,1:8],na.rm=TRUE),rowMeans(tab[,9:12],na.rm=TRUE))

devrait fonctionner également
Serge

Jennifer Nacef
Messages : 28
Enregistré le : 24 Fév 2015, 08:53

Re: Moyenne par ligne et boucle for

Messagepar Jennifer Nacef » 16 Sep 2015, 12:01

Effectivement je suis partie chercher compliqué alors qu'il y avait beaucoup plus simple :)

Merci beaucoup

Edit:
Initialement je cherchais une fonction avec une boucle car je voulais aussi appliquer une fonction que j'ai créer à chaque ligne.

Code : Tout sélectionner

> se <-function(vecteur, na.rm = TRUE) { sd(vecteur,na.rm=TRUE)/sqrt(length(vecteur)) }

Cette fonction toute bête pour avoir mes barres d'erreurs sur mes graphes ne peut être appliquée dans le cas du ligne par ligne. D'où ma boucle.

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Moyenne par ligne et boucle for

Messagepar Serge Rapenne » 16 Sep 2015, 12:19

Là encore, vive la vectorisation : cf la fonction apply qui permet de réaliser des calculs par ligne ou par colonne.

Par exemple dans ton cas :

Code : Tout sélectionner

tab.final$se<-apply(tab,1,function(vecteur) sd(vecteur,na.rm=TRUE)/sqrt(length(vecteur)))


Code : Tout sélectionner

?apply
pour les détails

Serge

Navarre Julien
Messages : 367
Enregistré le : 20 Avr 2012, 08:27

Re: Moyenne par ligne et boucle for

Messagepar Navarre Julien » 16 Sep 2015, 18:10

Bonjour, juste pour préciser, l'utilisation de fonctions de la famille *apply n'est pas de la vectorisation puisqu'on retrouve des boucles for dans leur définition. On parle de programmation fonctionnelle pour les fonctions de cette famille. Pour un utilisateur de R c'est (en général) beau à lire et facile à utiliser. Ces fonctions appliquent automatiquement les bonnes pratiques liées aux boucles, comme la pré-allocation de la taille finale d'un objet, ce qui peut permettre d'observer des gains de performances par rapport à une boucle mal codée. Certaines fonctions de la famille sont également codées en C (lapply, vapply).

Jennifer Nacef
Messages : 28
Enregistré le : 24 Fév 2015, 08:53

Re: Moyenne par ligne et boucle for

Messagepar Jennifer Nacef » 18 Sep 2015, 11:29

Merci beaucoup pour ton aide Serge et pour ces infos Julien :)

Bonne journée ! :)


Retourner vers « Questions en cours »

Qui est en ligne

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