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 :

Manipulation de la base de donnees meteo


Sujet :

R

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 6
    Points : 8
    Points
    8
    Par défaut Manipulation de la base de donnees meteo
    Bonjour a tous,
    Je suis nouvellement inscrit au forum et voudrais solliciter votre aide dans la réorganisation de mes données avec R.
    J'ai mes des données de pluies journalières en fichier txt organisées en 4 colonnes: jours, mois, années et valeurs enregistrées sur plus d'une cinquantaines d’années et pour plusieurs stations comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       jours       mois     années           pluvio
           1          1       1950              0.00000000
           2          1       1950              0.00000000
           3          1       1950              6.00000000
           4          1       1950              0.00000000
           .
           .
           .
          28         12       2010              2.00000000
          29         12       2010              -9999
          30         12       2010              0.00000000
          31         12       2010              0.00000000
    Je voudrais les réorganiser en valeurs mensuelles de chaque année, calculer les moyennes et les totaux annuels en tenant compte d'un certain nombre X de valeurs manquantes (-9999) pour lequel le mois ou l’année sera exclus.
    Je vous remercie d'avance pour vos précieuses suggestions.

  2. #2
    Membre expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Points : 3 378
    Points
    3 378
    Par défaut
    Bonjour et bienvenue,

    Quelques pistes (je pars du principe que tu as chargé tes données dans une data.frame donnees) :
    • Pour l'ordre, voir la fonction order().
    • Concernant les valeurs manquantes, il faut les coder en NA (not available) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      donnees[donnees[ , " pluvio"] == -9999, "pluvio"] <- NA
    • Pour les sommes et moyennes, en supprimant les NAs, regarde l'aide de, respectivement, sum() et mean(), en conjonction avec tapply() (qui permet d'appliquer ces fonctions par groupe).


    Pour trouver de l'aide sur une fonction particulière, voir ce post : http://www.developpez.net/forums/d89...e-fonctions-r/
    Forum LaTeX : pour des réponses rapides et appropriées, pensez à poster un
    ECM = Exemple (reproduit le problème) Complet (document compilable) Minimal (ne postez pas votre thèse !)

    Une solution vous convient ? N'oubliez pas le tag


    )><))))°>

  3. #3
    Membre expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Points : 3 378
    Points
    3 378
    Par défaut
    Tant que j'y pense, je ne suis pas un grand connaisseur du package data.table mais il me semble particulièrement adapté pour ce que tu as à faire. Il est beaucoup plus efficace sur la manipulation de gros jeux de données et sera plus intuitif d'utilisation pour les statistiques par groupe.

    ...Et comme tu débutes en R, autant investir directement tes efforts d'apprentissage dans ce qui est le plus adapté pour toi !

    http://cran.r-project.org/web/packag...ble/index.html
    http://datatable.r-forge.r-project.org/
    Forum LaTeX : pour des réponses rapides et appropriées, pensez à poster un
    ECM = Exemple (reproduit le problème) Complet (document compilable) Minimal (ne postez pas votre thèse !)

    Une solution vous convient ? N'oubliez pas le tag


    )><))))°>

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 6
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup pour les suggestions.
    J'ai essayé la première option avec tapply() qui a bien marché.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DailyData<-read.table('E:\\R_ANALYSIS\\Data\\P_Pagouda.txt', header=FALSE, sep='')
    DailyData[DailyData[ , 4] == -9999, 4] <- NA
    DailyData<-as.data.frame(DailyData)
    MAN<-tapply(DailyData[,4],list(DailyData[,2],DailyData[,3]),sum)
    Les noms donnés aux colonnes précédemment étaient juste pour l'explication.

    Cette fois ci j'essaye sans succès d’écrire une boucle if else qui devra prendre en compte le nombre de NA de chaque mois de chaque années avant toute opération. Ceci me permettra de fixer un niveau de NA en dessous duquel il faut faire l’opération et au-dessus duquel il faut renvoyer NA.

    Je vous prie de bien vouloir m'orienter si vous avez des suggestions.
    Merci.

  5. #5
    Membre expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Points : 3 378
    Points
    3 378
    Par défaut
    Bonjour,

    Toujours dans le tapply(), tu peux définir une fonction personnalisée au lieu d'en utiliser une existante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    MAN <- tapply(DailyData[ , 4],
                  list(DailyData[ , 2], DailyData[ , 3]),
                  function(x,...)
                  {
                      if (sum( ! is.na(x)) < 5)
                      {
                          return(NA)
                      }else{
                          return(sum(x,...))
                     }
                  },
                  na.rm=TRUE)
    Avec la condition qui te convient bien entendu.

    PS. N'hésite pas à aérer le code !
    Forum LaTeX : pour des réponses rapides et appropriées, pensez à poster un
    ECM = Exemple (reproduit le problème) Complet (document compilable) Minimal (ne postez pas votre thèse !)

    Une solution vous convient ? N'oubliez pas le tag


    )><))))°>

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 6
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    Je voudrais encore une fois vous dire un grand merci pour le soutien.
    J'ai essaye votre proposition d'hier en faisant ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    MAN<-tapply(DailyData[,4],list(DailyData[,2],DailyData[,3]),
                function(year.months=1:12){
                 for (i in 1:length(year.months)) 
                 {
                   if (sum( ! is.na(i)) > 5)
                   {
                     return(NA)
                   }else{
                     return(sum(i))
                   }
                 }
                },
                 na.rm=TRUE)
    j'obtient une erreur comme ceci:
    Error in FUN(X[[1L]], ...) : unused argument (na.rm = TRUE)
    Quand j'exclus na.rm=TRUE du code, j'obtient pour toutes les valeurs calculees 1, 1, 1, 1, 1, 1, 1, ..........
    J'ai essaye plusieurs autres options sans succes.
    Merci de bien vouloir m'eclaircir davantage sur l'utilisation du code precedent que vous m'aviez suggere.

  7. #7
    Membre expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Points : 3 378
    Points
    3 378
    Par défaut
    En fait, la première chose qui lui pose problème, c'est que les arguments qui viennent après la fonction/définition de fonction, dans le tapply, sont passés à ladite fonction (à l'exception notable des arguments propres au tapply, tels que simplify=TRUE).
    Dans ma précédente définition, ils étaient représentés par ..., ce qui veut dire que na.rm=TRUE était passé à la fonction définie dans le tapply, qui elle même le passait à sum. Il faut donc laisser les trois points qui ont un réel sens dans la définition si tu souhaites pouvoir lui passer des arguments supplémentaire sans explicitement nommer ceux-ci.

    Mais le principal problème, est ici dans la compréhension du lien entre tapply et la fonction qui lui est passée (ne t'en fait pas, c'est tout à fait normal, cette famille de fonction est peu intuitive).

    Il faut que tu repenses bien à ce que faisait la fonction lorsque tu lui passais juste sum (ton premier exemple de code) : tu obtenais une somme de ta variable pour chaque combinaison de tes facteurs.
    Ce que fait tapply, c'est donc de passer à ta fonction, comme premier argument (le x dans mon exemple de définition), un sous ensemble de ta variable correspondant à une combinaison de tes facteur. Opération répétée autant de fois qu'il y a de combinaisons de facteurs.

    Hors ta définition de fonction n’accepte pas d'argument "variable". Tu lui fixes le seul argument, qui est year.months. Donc ta fonction entre systématiquement dans le if avec i=1, et est terminée immédiatement par le même return(sum(i))... d'où ta série de 1.

    Tu devrais essayer d'exécuter tel-quel l'exemple que je t'ai fourni : tu verras que ça boucle déjà sur les mois s'ils sont bien dans tes facteurs.
    Tu devrais du coup récupérer en sortie une matrice des sommes par mois et année, avec les mois en lignes et les années en colonnes... ou l'inverse.

    Voilà, j'espère avoir été assez clair... c'est pas facile avec ces fonctions !
    Forum LaTeX : pour des réponses rapides et appropriées, pensez à poster un
    ECM = Exemple (reproduit le problème) Complet (document compilable) Minimal (ne postez pas votre thèse !)

    Une solution vous convient ? N'oubliez pas le tag


    )><))))°>

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 6
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    Effectivement en appliquant tout simplement le code, ca marche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DailyData<-read.table('E:\\R_ANALYSIS\\Data\\Pr_Pagouda.txt', header=FALSE, sep='')
    DailyData[DailyData[ , 4] == -9999, 4] <- NA
    DailyData<-as.data.frame(DailyData)
     
    MAN<-tapply(DailyData[,4],list(DailyData[,2],DailyData[,3]),
                function(x){
                   if (sum(!is.na(x)) < 5)
                   {
                     return(NA)
                   }else{
                     return(sum(x))
                   }
                 })
    Je cherchais trop loin ce qui etait juste a cote!!
    Je vous remercie sincerement pour tout.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/01/2015, 20h07
  2. manipulation d'une base de donnees oracle via datagrid
    Par navorinco dans le forum ASP.NET
    Réponses: 23
    Dernier message: 23/08/2010, 11h24
  3. taille maximale d'une base de donnée paradox
    Par Anonymous dans le forum Paradox
    Réponses: 5
    Dernier message: 14/02/2004, 17h39
  4. [VB6] [Access] Compacter une base de donnée
    Par mdoyer dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 24/09/2002, 11h33
  5. [VB6] [ODBC] Référencer une base de données avec vb
    Par af.balog dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 13/09/2002, 09h51

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