Moyenne par minute

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

eliane assy
Messages : 5
Enregistré le : 27 Avr 2018, 09:19

Moyenne par minute

Messagepar eliane assy » 31 Mai 2018, 12:26

Bonjour à tous,
J'ai un gros jeux de données sur les microcapteurs qui mesurent les particules fines.
Ces microcapteurs mesurent chaque une seconde parfois 2s la concentration massique et en nombre des particules fines
J'essaie de reduire les fluctuations un peu en moyennant mes données (ex: cap10PM1) par minutes ou 3 minutes, mais je n'arrive pas a les moyenner, j'ai essayer plusieurs code mais a chaque fois ca ne marche pas
Any idea?
Merci d'avance

summary(A10_13_02)
Date cap10PM1 cap10PM25 cap10PM10
Min. :2018-02-13 00:00:00 Min. : 0.00 Min. : 0.00 Min. : 0.0
1st Qu.:2018-02-13 04:27:18 1st Qu.: 0.00 1st Qu.: 0.00 1st Qu.: 0.0
Median :2018-02-13 09:50:00 Median : 0.00 Median : 0.00 Median : 2.0
Mean :2018-02-13 10:40:00 Mean : 32.09 Mean : 63.88 Mean : 87.9
3rd Qu.:2018-02-13 16:38:49 3rd Qu.: 72.00 3rd Qu.:140.00 3rd Qu.:176.0
Max. :2018-02-13 23:59:58 Max. :161.00 Max. :327.00 Max. :533.0



str(A10_13_02)
data.frame': 52161 obs. of 12 variables:
$ Date : POSIXct, format: "2018-02-13 00:00:00" "2018-02-13 00:00:01" "2018-02-13 00:00:02" "2018-02-13 00:00:03" ...
$ cap10PM1 : int 0 0 0 0 0 0 0 0 0 0 ...
$ cap10PM25 : int 0 0 0 0 0 0 0 0 0 0 ...
$ cap10PM10 : int 0 0 0 0 0 0 0 0 0 0 ...

J'ai essaye ce code : with(A10_13_02,tapply(value,c(cap10PM1,format(Date,"%Y-%m-%d %H:%M)),mean),
Mais c koi value?

Merci d'avance pour votre aide
Eliane

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

Re: Moyenne par minute

Messagepar Serge Rapenne » 31 Mai 2018, 12:57

Bonjour,

Code : Tout sélectionner

?tapply

pour l'aide de la fonction tapply, les exemples sont très parlant.

Sinon si tu veux faire les calculs de moyennes par minutes pour toutes les colonnes de polluant d'un seul coup :

Code : Tout sélectionner

resultat<-apply(A10_13_02[,-1],2,tapply,format(A10_13_02$Date,"%Y-%m-%d %H:%M),mean,na.rm=T)

ou avec le package dplyr

Code : Tout sélectionner

library(dplyr)
A10_13_02 %>%  group_by(format(Date,"%Y-%m-%d %H:%M")) %>% summarise_at(2:ncol(A10_13_02),mean,na.rm=T)


Serge

Edit.
Je viens de voir qu'il manquait un " dans le apply à la fin du format "%Y-%m-%d %H:%M . le code devait être :

Code : Tout sélectionner

resultat<-apply(A10_13_02[,-1],2,tapply,format(A10_13_02$Date,"%Y-%m-%d %H:%M"),mean,na.rm=T)

eliane assy
Messages : 5
Enregistré le : 27 Avr 2018, 09:19

Re: Moyenne par minute

Messagepar eliane assy » 31 Mai 2018, 15:31

Bonjour,

Merci beaucoup la fonction tapply ne marche pas toutes les cases sont NA, tandis que avec dplyr ca marche.
Si je veux faire la moyenne sur 3 minutes qu'est ce que je change dans le code?
Merci d'avance
Eliane

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

Re: Moyenne par minute

Messagepar Serge Rapenne » 31 Mai 2018, 15:40


eliane assy
Messages : 5
Enregistré le : 27 Avr 2018, 09:19

Re: Moyenne par minute

Messagepar eliane assy » 31 Mai 2018, 15:53

J'ai essaye ce code pour la moyenne sur 3 minutes, vous l'avez ecrit sur une autre discussion mais ca marche pas
Je suis desolee pour le derangement merci beaucoup

Eliane


##moyenne sur 3 minutes
A10_13_02 %>% mutate(groupe_minute=as.integer(format(Date),"%M") %/% 3 ) %>% group_by(format(Date,"%Y-%m-%d %H),groupe_minute) %>% summarise_at(2:ncol(A10_13_02),mean,na.rm=TRUE)

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

Re: Moyenne par minute

Messagepar Serge Rapenne » 01 Juin 2018, 07:21

Bonjour,

ca marche pas
ça ne va pas m'aider bcp. Il y a un message d'erreur ? le résultat attendu n'est pas le bon ?

Pour faire des tests, il faudrait des données : http://forums.cirad.fr/logiciel-R/viewtopic.php?f=1&t=3302 et http://forums.cirad.fr/logiciel-R/viewtopic.php?f=1&t=7638

Je conseil également la lecture de : http://www.linux-france.org/article/these/smart-questions/smart-questions-fr.html
Serge

eliane assy
Messages : 5
Enregistré le : 27 Avr 2018, 09:19

Re: Moyenne par minute

Messagepar eliane assy » 05 Juin 2018, 14:14

Bonjour Monsieur Serge,
J'ai essaye de travailler sur autres données pour réduire le jeu de données au minimum nécessaire et d'appliquer dput. Si je transforme la date en POSIXct elle apparait sous forme d'une serie de nombres. Je la laisse sous forme facteur.

Code : Tout sélectionner

head(data)
                 Date PM1 PM2.5 PM10
1 2018-02-15 00:00:13  13    17   22
3 2018-02-15 00:00:43  12    17   18


Code : Tout sélectionner

> dput(data_)
structure(list(Date = structure(1:18, .Label = c("2018-02-15 00:00:13",
"2018-02-15 00:00:43", "2018-02-15 00:01:23", "2018-02-15 00:01:53",
"2018-02-15 00:02:01", "2018-02-15 00:02:10", "2018-02-15 00:03:02",
"2018-02-15 00:03:41", "2018-02-15 00:04:05", "2018-02-15 00:04:26",
"2018-02-15 00:05:16", "2018-02-15 00:05:56", "2018-02-15 00:06:07",
"2018-02-15 00:06:38", "2018-02-15 00:07:03", "2018-02-15 00:07:40",
"2018-02-15 00:08:08", "2018-02-15 00:08:52"), class = "factor"),
    PM1 = c(13L, 12L, 10L, 10L, 10L, 10L, 11L, 12L, 12L, 12L,
    11L, 9L, 10L, 10L, 10L, 11L, 10L, 11L), PM2.5 = c(17L, 17L,
    16L, 15L, 16L, 15L, 17L, 17L, 17L, 17L, 18L, 15L, 17L, 15L,
    17L, 18L, 17L, 17L), PM10 = c(22L, 18L, 17L, 16L, 19L, 17L,
    19L, 19L, 20L, 22L, 22L, 20L, 22L, 19L, 19L, 19L, 18L, 20L
    )), .Names = c("Date", "PM1", "PM2.5", "PM10"), class = "data.frame", row.names = c(NA,
-18L))



Pour appliquer la moyenne sur 3 minutes, j'ai utilise
library(dplyr)

Code : Tout sélectionner

data_ %>% mutate(groupe_minute=as.integer(format(Date),"%M") %/% 3)%>% group_by(format(Date,"%Y-%m-%d %H"),groupe_minute) %>% summarise_at(2:ncol(data_),mean,na.rm=TRUE)


L'erreur est la suivante:
Error in mutate_impl(.data, dots) :
Evaluation error: invalid 'trim' argument.
In addition: Warning message:
In evalq(as.integer(format(Date), "%M")%/%3, <environment>) :
NAs introduced by coercion

J'espere que ca est comprehensible
Merci d'avance pour votre Aide
Eliane

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

Re: Moyenne par minute

Messagepar Serge Rapenne » 05 Juin 2018, 15:28

C'est bien mieux avec les données, ça m'a permis de trouver rapidement qu'il y avait une petite erreur de parenthèses dans groupe_minute=as.integer(format(Date),"%M").

Le bon code est

Code : Tout sélectionner

data_ %>% mutate(groupe_minute=as.integer(format(Date,"%M")) %/% 3)%>% group_by(format(Date,"%Y-%m-%d %H"),groupe_minute) %>% summarise_at(2:ncol(data_),mean,na.rm=TRUE)

au préalable, il a également fallu que je transforme la variable Date dans ton jeu de données qui est un facteur et non un date (format date ou POSIXct)

Code : Tout sélectionner

data_$Date<-as.POSIXct(data_$Date)


Serge

eliane assy
Messages : 5
Enregistré le : 27 Avr 2018, 09:19

Re: Moyenne par minute

Messagepar eliane assy » 05 Juin 2018, 15:50

Bonjour,
Parfait merci beaucoup pour la rapidite de la reponse
le code fonctionne a 100%, mon resultat est sous cette forme

Code : Tout sélectionner

> dput(XY)
structure(list(`format(Date, "%Y-%m-%d %H")` = c("2018-02-15 00",
"2018-02-15 00", "2018-02-15 00"), groupe_minute = c(0, 1, 2),
    PM1 = c(10.8333333333333, 11.1666666666667, 10.3333333333333
    ), PM2.5 = c(16, 16.8333333333333, 16.8333333333333), PM10 = c(18.1666666666667,
    20.3333333333333, 19.5)), .Names = c("format(Date, \"%Y-%m-%d %H\")",
"groupe_minute", "PM1", "PM2.5", "PM10"), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -3L), vars = "format(Date, \"%Y-%m-%d %H\")", drop = TRUE)


Y-a-t-il une possibilite de creer une colonne de date moyennée sur 3 minutes pour faciliter l'interpretation de mes données.
Merci beaucoup Monsieur Serge
Eliane

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

Re: Moyenne par minute

Messagepar Serge Rapenne » 11 Juin 2018, 12:09

Bonjour,

Il est bien sur possible de créer un champ date horodaté au milieu de l'intervalle. J'utilise le package lubridate qui simplifie l'ajout des 1'30" nécessaire

Code : Tout sélectionner

#j'ai un peu changé le group_by pour simplifier le nom de la colonne de date
XY<-data_ %>%  mutate(groupe_minute=as.integer(format(Date,"%M")) %/% 3)%>% group_by(Date=format(Date,"%Y-%m-%d %H"),groupe_minute) %>% summarise_at(2:ncol(data_),mean,na.rm=TRUE)

library(lubridate)
XY %>% mutate(date_moy=as.POSIXct(paste(Date,groupe_minute*3,sep=":"))+minutes(1)+seconds(30))
# A tibble: 3 x 6
# Groups:   Date [1]
  Date          groupe_minute   PM1 PM2.5  PM10 date_moy           
  <chr>                 <dbl> <dbl> <dbl> <dbl> <dttm>             
1 2018-02-15 00             0  10.8  16    18.2 2018-02-15 00:01:30
2 2018-02-15 00             1  11.2  16.8  20.3 2018-02-15 00:04:30
3 2018-02-15 00             2  10.3  16.8  19.5 2018-02-15 00:07:30


Serge


Retourner vers « Questions en cours »

Qui est en ligne

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