IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Création d'une fonction permettant de calculer moyenne et écart type de plusieurs groupes


Sujet :

R

  1. #1
    Candidat au Club
    Femme Profil pro
    Data analysis en neurosciences
    Inscrit en
    Février 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : Suisse

    Informations professionnelles :
    Activité : Data analysis en neurosciences
    Secteur : Santé

    Informations forums :
    Inscription : Février 2019
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Création d'une fonction permettant de calculer moyenne et écart type de plusieurs groupes
    Bonjour !

    Je suis étudiante en neurosciences et utilise R depuis maintenant quelques années pour analyser mes données statistiques. Je me suis mise dans l'idée de créer une fonction regroupant tous mes codes préexistant pour faire une ANOVA et me heurte à un souci dès le départ : étant donné que mes résultats sont sous la forme suivante :

    groupe mesure
    x.............1
    x.............2
    x.............4
    y.............5
    y.............1
    y.............8
    z.............4
    z.............2
    z.............3

    donc plusieurs groupes contenant plusieurs mesures (1 pour chaque individu du groupe) (par exemple : les poids(mesure) de 3 souris vertes, rouges, et bleues (groupes)).

    Dans mon code original, je commence à calculer la moyenne des mesures de chaque groupe avec tapply(groupe,mesure,mean). J'aimerai implémenter cela dans un fonction (function(x)) mais tapply ne semble pas marcher dans ce cas.
    j'ai essayé cela mais ce n'est pas mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    anova_function <- function(x,y) {
      group <- levels(x)
      for (i in 1:length(group)){
        mes.moy <- mean(y)
      }
     
      return(mes.moy)
    }
    j'aimerai que la fonction me retourne les moyennes de chaque groupe.
    je pense que la solution est évidente mais j'ai besoin d'un petit coup de pouce =)

    Merci !

  2. #2
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    Bonjour,

    tapply comme n'importe quelle autre fonction peut être appelée dans le corps d'une autre fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    tab <- structure(list(groupe = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 
    3L, 3L), .Label = c("x", "y", "z"), class = "factor"), mesure = c(1L, 
    2L, 4L, 5L, 1L, 8L, 4L, 2L, 3L)), row.names = c(NA, -9L), class = "data.frame")
     
    fun <- function(x, y) {
      mns <- tapply(x, y, mean)
      mns
      }
     
    fun(tab$mesure, tab$groupe)
           x        y        z 
    2.333333 4.666667 3.000000
    Avec un data.frame il y a pas mal de possibilités pour faire ce genre d'opération, par exemple la fonction aggregate ou le package dplyr.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    aggregate(mesure ~ groupe, tab, mean)
      groupe   mesure
    1      x 2.333333
    2      y 4.666667
    3      z 3.000000
    cdlt

  3. #3
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    Pour compléter la réponse de tototode, l'argument FUN de la fonction aggregate peut être n'importe quelle fonction, même une fonction anonyme. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fg <- aggregate( VAL ~ GR, don, function( x) c( M=mean( x), S=sd( x)))
    Il faut simplement se rappeler que dans ce cas et pour l'exemple ci-dessus, le résultat fg sera un data.frame à deux colonnes (GR et VAL) et que la colonne VAL contiendra une matrice à deux colonnes nommées respectivement M et S.
    Donc : fg[,1] contiendra les valeurs de GR, fg[,2], la matrice, et fg[1,] sera un data.frame d'une ligne.

  4. #4
    Candidat au Club
    Femme Profil pro
    Data analysis en neurosciences
    Inscrit en
    Février 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : Suisse

    Informations professionnelles :
    Activité : Data analysis en neurosciences
    Secteur : Santé

    Informations forums :
    Inscription : Février 2019
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci à vous deux ! c'est top

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/01/2017, 20h35
  2. calcul moyenne et écart-type avec Eigen
    Par med.doc dans le forum C++
    Réponses: 0
    Dernier message: 29/09/2013, 15h23
  3. Aide pour la création d'une fonction - moyenne mobile exponentielle
    Par antoineDG dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/06/2012, 17h13
  4. Création d'une fonction sans paramètre?
    Par falcon dans le forum Oracle
    Réponses: 3
    Dernier message: 13/12/2004, 11h32
  5. Réponses: 14
    Dernier message: 09/04/2004, 13h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo