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 :

Besoin d'aide pour créer une fonction


Sujet :

R

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant E-Learning
    Inscrit en
    Juin 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant E-Learning

    Informations forums :
    Inscription : Juin 2020
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Besoin d'aide pour créer une fonction
    Bonjour,
    Je dois créer une fonction qui calculera les statistiques descriptives sur les données météos pour une unité de temps donnée (par exemple par jour, par mois, etc...).
    Cette fonction doit avoir comme arguments :
    var_interest: variable sur laquelle les statistiques descriptives vont être calculées,
    g: vecteur qui définit les différents temps,
    titre: vecteur contenant les éléments de titre (cf. document stat_desc.txt)
    myfun: un vecteur contenant les indices descriptifs à calculer.
    Par défaut, le vecteur myfun sera défini par c(’mean’, ’sd’, ’min’, ’max’).
    La fonction doit renvoyer une matrice contenant une ligne par unité de temps (jour ou
    mois) et x colonnes : une colonne pour chaque indice descriptif calculé.
    Arrondir les résultats à deux décimales.
    Par défaut, la matrice aura donc 4 colonnes, une pour la moyenne, une pour l’écart-type,
    une pour le minimum et une pour le maximum. Veillez à avoir un affichage correct dans
    la console.

    Voilà le type de resultats que je dois avoir au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    ## ========================================================== 
    ##  Statistiques par  mois  de la variable humidité relative 
    ## ---------------------------------------------------------- 
    ##                    mean     sd      min     max   
    ## 2019-02   73.42   19.03   28.05   99.45   
    ## 2019-03   77.12   17.05   32.00   103.00   
    ## ...
    ## 2019-12   68.89   18.45   99.00  100.00  
    ## ==========================================================
     
    ## ========================================================== 
    ##  Statistiques par  mois  de la variable température 
    ## ---------------------------------------------------------- 
    ##                   mean     sd      min     max   
    ## 2019-02   73.42   19.03   28.05   99.45   
    ## 2019-03   77.12   17.05   32.00   103.00   
    ## ...
    ## 2019-12   68.89   18.45   99.00  100.00  
    ## ==========================================================
    J’ai déjà essayé beaucoup de choses. J’arrive à avoir mes 4 colonnes pour mes statistiques descriptives (mystats) par unité de temps (g) et pour chacune des variables (var_interest)… mais sans aucun nom de colonnes et pas sous forme de matrice (j'ai essayé d'ajouter dimnames() dans la fonction mais ça ne marche pas)
    Je suis perdue… je suppose au final que je ne devrai peut-être pas utiliser tapply car je n’utilise pas tous les arguments… mais je ne vois pas quelle autre fonction utiliser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    g <- meteo$month
    myfun <- c("mean", "sd", "min", "max")
    mystats <- function(x){c(mean(x), sd(x), min(x), max(x))}
     
    for (var_interest in meteo[,1:4]){print(tapply(var_interest, g, mystats))}
     
    Même le test pour mon titre ne fonctionne pas, le nom de la variable ne s’affiche pas. Une idée de pourquoi ?
    var_interest <- meteo$T
    titre <- cat ("Statistiques par jour de la variable", colnames(var_interest),"\n")
    colnames(meteo)<- c("Température", "Pression Atmosphérique", "Humidité relative", "Point de rosée", "Date", "Mois")
    Merci d'avance pour votre aide… même une piste de fonction à explorer m'aiderait déjà! (et peut-être pourquoi mon titre ne va pas chercher le nom de la variable?)

    Bien à vous,
    A.

  2. #2
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Pour le titre, c'est dû à la nature de ton objet var_interest : c'est un vecteur et donc il n'a pas de colnames.

    Ensuite une piste à adapter : j'ai utilisé des données exemple de R (mtcars) pour imaginer sortir des stats par nombre de cylindres (cyl) sur toutes les autres colonnes du data.frame.
    Pour ta fonction mystats, nommer les éléments du vecteur en sortie permet de personnaliser les noms de colonnes. Ensuite j'ai tendance à préférer aggregate à tapply pour les calculs par groupe.
    Enfin un lapply permet de récupérer facilement le nom de la variable résumée (c'est le nom de l'élément de liste) sans écrire la boucle explicitement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    data(mtcars) # données exemple
     
    mystats <- function(x){c(mean=mean(x), 
                             sd=sd(x), 
                             min=min(x), 
                             max=max(x))}
     
    lapply(mtcars[,setdiff(colnames(mtcars),"cyl")], # pour toutes les colonnes sauf cyl
           function(var){
             aggregate(x=var, 
                       by=list("cyl"=mtcars[["cyl"]]), 
                       FUN=mystats)
           })
    Comme tu peux le constater, la variable de groupement est toujours évoquée sous la forme d'un nom. Ce qui veut dire qu'on peut facilement la transformer en paramètre d'une fonction. Quant à la table, il suffit d'avoir un paramètre df contenant le nom du data.frame (sans guillemets cette fois, il faut que ce soit l'objet) et remplacer mtcars par df partout dans le code ci-dessus.
    Bon courage.
    Olivier

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant E-Learning
    Inscrit en
    Juin 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant E-Learning

    Informations forums :
    Inscription : Juin 2020
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Merci!
    Un grand merci! J'essaie d'appliquer ça chez moi aujourd'hui!
    Je suis assez confiant que ça va me débloquer!
    Je vous souhaite un excellent Dimanche!

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant E-Learning
    Inscrit en
    Juin 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant E-Learning

    Informations forums :
    Inscription : Juin 2020
    Messages : 3
    Points : 1
    Points
    1
    Par défaut encore un point bloquant
    Bonjour,

    J'ai presque réussi.
    Il ne me reste qu'un point : je dois pouvoir changer la variable temps de mois à jours - dans votre simulation, la variable cylindre.

    Mon code fonctionne avec g = mois mais quand je passe à g = jours, ma date (format(meteo_charleroi$date, "%Y-%m-%d")) dans mes résultats ne reste pas sous format 'date' mais devient un chiffre :

    Statistiques descriptives de la variable Point de rosée
                 mean   sd     min  max
    17897    4.57    1.14   2.1  6.5
    17898    0.76    0.62  -0.3  1.9
    17899    1.42    0.29   0.8  2.1
    17900    0.65    0.93  -1.1  2.1
    17901    3.06    1.02   0.8  4.3
    17902    1.88    0.62   0.8  2.7
    J'ai essayé de transformer ma date en facteur mais ça ne fonctionne pas - ou alors je le fais mal.
    Une dernière piste?

    Une tout grand merci d'avance!

Discussions similaires

  1. [C++] Besoin d'aide pour créer une dll.
    Par Vince dans le forum Débuter
    Réponses: 3
    Dernier message: 15/03/2010, 13h55
  2. Besoin d'aide pour créer une requête
    Par cedric/copy dans le forum ASP
    Réponses: 6
    Dernier message: 13/03/2009, 16h29
  3. Besoin d'aide pour créer une fonction
    Par xavxx58 dans le forum Prolog
    Réponses: 13
    Dernier message: 14/09/2008, 13h03
  4. Besoin d'aide pour créer une requête
    Par fabien59420 dans le forum Requêtes et SQL.
    Réponses: 44
    Dernier message: 26/05/2008, 11h08
  5. Besoin d'aide pour créer une BD
    Par desfrags dans le forum Débuter
    Réponses: 6
    Dernier message: 30/01/2008, 22h20

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