Ranger des résultats dans un data frame

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

Houda Heffaoui
Messages : 27
Enregistré le : 18 Avr 2008, 07:56

Ranger des résultats dans un data frame

Messagepar Houda Heffaoui » 24 Avr 2008, 15:10

Bonjour à tous,

je débute dans la manipulation du logiciel R et j'ai donc quelques problèmes qui ne doivent pas être très compliqués à résoudre...
Voici un extrait du tableau de données :


Code : Tout sélectionner

Station   Date   Valeur
St1   01/04/08 01:00   5
St2   01/04/08 01:00   4
St3   01/04/08 01:00   8
St4   01/04/08 01:00   9
St5   01/04/08 01:00   3
St1   01/04/08 02:00   2
St2   01/04/08 02:00   1
St3   01/04/08 02:00   75
St4   01/04/08 02:00   8
St5   01/04/08 02:00   2
St1   01/04/08 03:00   0
St2   01/04/08 03:00   4
St3   01/04/08 03:00   7
St4   01/04/08 03:00   6
St5   01/04/08 03:00   9



J'aimerais créer un nouveau tableau de données avec la valeur maximale pour l'ensemble de 5 stations pour chaque heure. J'ai réussi à récupérer les valeurs max dans un vecteur mais je ne vois pas comment associer la date et heure à chaque valeur.
Voici le code que j'ai écrit :

Code : Tout sélectionner

 fonction<-function(f){
        i=1
       
        maxO3=NULL
       
        while(i<=nrow(f))
             {
                maxi<-f[i,3]

              for(j in 1:5)
               {
                maxi<-max(maxi , f[i,3] , na.rm=TRUE)   
                i=i+1
               }
           
               maxval<-c(maxval,maxi)
}
return(maxval)}


Si quelqu'un a une idée, cela m'aiderait beaucoup.
Je pense que ça ne doit pas étre compliqué à résoudre mais la je ne vois pas.

En vous remerciant,

Houda

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

Messagepar Renaud Lancelot » 24 Avr 2008, 16:15

Voir ?aggregate

Code : Tout sélectionner

> dfr
   Station           Date Valeur
1      St1 01/04/08 01:00      5
2      St2 01/04/08 01:00      4
3      St3 01/04/08 01:00      8
4      St4 01/04/08 01:00      9
5      St5 01/04/08 01:00      3
6      St1 01/04/08 02:00      2
7      St2 01/04/08 02:00      1
8      St3 01/04/08 02:00     75
9      St4 01/04/08 02:00      8
10     St5 01/04/08 02:00      2
11     St1 01/04/08 03:00      0
12     St2 01/04/08 03:00      4
13     St3 01/04/08 03:00      7
14     St4 01/04/08 03:00      6
15     St5 01/04/08 03:00      9
> aggregate(dfr[ , "Valeur", drop = FALSE], list(Date = dfr$Date), max)
            Date Valeur
1 01/04/08 01:00      9
2 01/04/08 02:00     75
3 01/04/08 03:00      9


Renaud

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

Messagepar Renaud Lancelot » 24 Avr 2008, 16:49

J'allais oublier tapply (mais le résultat n'est pas un data.frame):

Code : Tout sélectionner

> with(dfr, tapply(Valeur, Date, max))
01/04/08 01:00 01/04/08 02:00 01/04/08 03:00
             9             75              9


Renaud

Houda Heffaoui
Messages : 27
Enregistré le : 18 Avr 2008, 07:56

Messagepar Houda Heffaoui » 25 Avr 2008, 07:13

Merci beaucoup Renaud pour cette réponse.
C'est exactement ce que je recherchais. J'aurais appris une nouvelle commande.

Houda

Houda Heffaoui
Messages : 27
Enregistré le : 18 Avr 2008, 07:56

Messagepar Houda Heffaoui » 06 Aoû 2008, 15:42

Bonjour,

J'ai une petit problème avec la commande aggregate.
Je l'ai appliqué sur d'autres données qui sont de la forme :

>dfr

Code : Tout sélectionner

Date         H        Valeur
   01/04/08 01:00   5
   01/04/08 01:00   4
   01/04/08 01:00   8
   01/04/08 01:00   9
   01/04/08 01:00   3
   01/04/08 02:00   2
   01/04/08 02:00   1
   01/04/08 02:00   75
   01/04/08 02:00   8
   01/04/08 02:00   2
   01/04/08 03:00   0
   01/04/08 03:00   4
   01/04/08 03:00   7
   01/04/08 03:00   6
   01/04/08 03:00   9


Et lorsque je lance la commande suivante :

Code : Tout sélectionner

aggregate(dfr[ ,"Valeur", drop = FALSE], list(Date = dfr$Date),list(Heure=dfr$H),max,na.rm=TRUE)
Erreur dans FUN(X[[1L]], ...) : arguments must have same length

aggregate(dfr$Valeur, list(dfr$Date),list(dfr$H),max,na.rm=TRUE)
Erreur dans FUN(X[[1L]], ...) : arguments must have same length


Je ne comprends pas cette erreur car j'avais déja exécuté cette commande et ca fonctionnait très bien.
Donc si quelqu'un a une idée, merci d'avance.

Houda

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 06 Aoû 2008, 16:49

Code : Tout sélectionner

aggregate(dfr$Valeur, list(dfr$Date),list(dfr$H),max,na.rm=TRUE)


Je ne vois pas bien à quoi peut vous servir le second list().

Si vous souhaiter faire un aggregate selon 2 facteurs la bonne syntaxe est :

Code : Tout sélectionner

aggregate(dfr$Valeur, by=list(c(dfr$Date,dfr$H)),FUN =max,na.rm=TRUE)


Dans votre code le second list() est en lieu et place de l'argument FUN de aggregate...il ne peut pas comprendre :)

Nicolas

Houda Heffaoui
Messages : 27
Enregistré le : 18 Avr 2008, 07:56

Messagepar Houda Heffaoui » 07 Aoû 2008, 06:53

Bonjour,

Merci pour votre réponse Nicolas.
Mais j'ai essayé votre commande mais ca ne fonctionne toujours pas.


Code : Tout sélectionner

test<-aggregate(dfr$Valeur,by=list(c(dfr$Date,dfr$H)),FUN=max,na.rm=TRUE)
Erreur dans FUN(X[[1L]], ...) : arguments must have same length


Je ne comprends vraiment pas d'où peut venir l'erreur.
Et j'ai aussi lancé la commande suivante :

Code : Tout sélectionner

traceback()
6: stop("arguments must have same length")
5: FUN(X[[1L]], ...)
4: lapply(x, tapply, by, FUN, ..., simplify = FALSE)
3: aggregate.data.frame(as.data.frame(x), ...)
2: aggregate.default(dne$Valeur, by = list(c(dne$Date, dne$H)),
       FUN = max, na.rm = TRUE)
1: aggregate(dne$Valeur, by = list(c(dne$Date, dne$H)), FUN = max,
       na.rm = TRUE)



où dne correspond à dfr.

Merci d'avance pour votre aide.

Houda

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

Messagepar Renaud Lancelot » 07 Aoû 2008, 07:57

Houda Heffaoui a écrit :

Code : Tout sélectionner

test<-aggregate(dfr$Valeur,by=list(c(dfr$Date,dfr$H)),FUN=max,na.rm=TRUE)
Erreur dans FUN(X[[1L]], ...) : arguments must have same length



La valeur fournie à l'argument by est une liste dont chaque élément est utilisé pour partitionner le vecteur ou le tableau donné en premier argument d'aggregate. Ici vous avez donné comme élément de cette liste

Code : Tout sélectionner

c(dfr$Date,dfr$H)


qui est un vecteur formé de l'empilement de deux vecteurs. Il est effectivement deux fois plus long que le vecteur donné en premier argument, d'où l'erreur. Je pense que vous voulez simplement:

Code : Tout sélectionner

test <- aggregate(dfr$Valeur, by = list(dfr$Date, dfr$H), FUN = max, na.rm = TRUE)

Je me répète : aérer le code en utilisant des espaces: cela le rend plus lisible et facilite la détection des erreurs telles que celle-ci.

Renaud

Houda Heffaoui
Messages : 27
Enregistré le : 18 Avr 2008, 07:56

Messagepar Houda Heffaoui » 07 Aoû 2008, 08:22

Bonjour Renaud,

Merci pour votre réponse. Je vais essayer d'aérer plus mon code pour que ce soit plus lisible.
J'ai essayé votre solution mais j'ai toujours une erreur :

Code : Tout sélectionner

> test <- aggregate(dfr$Valeur, by = list(dfr$Date, dfr$H), max, na.rm=TRUE)
Erreur dans FUN(X[[1L]], ...) :
  l'argument "INDEX" est manquant, avec aucune valeur par défaut


Et je ne vois vraiment pas d'où vient cette erreur. Et aussi à quoi correspond l'argument INDEX ?
Est ce que cela peut venir du fait que Date soit au format Date ?

Houda

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

Messagepar Renaud Lancelot » 07 Aoû 2008, 08:38

L'aide de aggregate dit:

Code : Tout sélectionner

aggregate is a generic function with methods for data frames and time series.


Vous donnez un vecteur comme premier argument: ce n'est ni un tableau ni une série chronologique.

Essayer:

Code : Tout sélectionner

test <- aggregate(dfr[ , "Valeur", drop = FALSE],
                  by = list(dfr$Date, dfr$H),
                  max, na.rm = TRUE)


Il peut être également plus clair de donner la function sous sa forme explicite:

Code : Tout sélectionner

test <- aggregate(x = dfr[ , "Valeur", drop = FALSE],
                  by = list(dfr$Date, dfr$H),
                  FUN = function(x) max(x, na.rm = TRUE))

Houda Heffaoui
Messages : 27
Enregistré le : 18 Avr 2008, 07:56

Messagepar Houda Heffaoui » 07 Aoû 2008, 08:47

Merci beaucoup Renaud.

La première solution ne fonctionne pas, mais la deuxième oui.

Houda


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité