Moyenner des données selon 2 colonnes et certaines lignes

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

Guilhem Freche
Messages : 11
Enregistré le : 01 Avr 2020, 08:45

Moyenner des données selon 2 colonnes et certaines lignes

Messagepar Guilhem Freche » 27 Juil 2022, 14:56

Bonjour,
le code ci-dessous me permet d'obtenir les moyennes selon 2 arguments qui sont des colonnes.

Code : Tout sélectionner

  mean_donnees <- do.call(
    what = "data.frame",
    args = aggregate(
      x = donnees[4],
      by =  donnees[c("voie","time")],
      FUN = function(x) mean = mean(x, na.rm = TRUE)
    ))
mean_sd_donnees <- arrange(mean_sd_donnees, by=voie)


Je souhaiterai ajouter un critère supplémentaire pour moyenner seulement les 2 derniers valeurs et non toutes celles selectionnées via "by = donnees[c("voie","time")]"

Les données utilisées :

Code : Tout sélectionner

donnees<-data.frame(
  timestamp = c(
    "2022-01-03 03:00:00","2022-01-03 03:10:00","2022-01-03 03:20:00","2022-01-03 03:30:00",
    "2022-01-03 03:40:00","2022-01-03 03:50:00","2022-01-03 04:00:00","2022-01-03 04:10:00",
    "2022-01-03 04:20:00","2022-01-03 04:30:00","2022-01-03 04:40:00","2022-01-03 04:50:00",
    "2022-01-03 05:00:00","2022-01-03 05:10:00","2022-01-03 05:20:00","2022-01-03 05:30:00",
    "2022-01-03 05:00:00","2022-01-03 05:10:00","2022-01-03 05:20:00","2022-01-03 05:30:00"
  ),
  voie = c(
    "B_1","B_1","B_1","B_1","B_1","B_1","B_1","B_1","B_1","B_1","B_2","B_2","B_2","B_2","B_2","B_2","B_2","B_2","B_2","B_2"),
  time = c(0,100,100,100,200,200,200,300,300,300,0,100,100,100,200,200,200,300,300,300),
  Temp = c(1,1,6,7,1,1,8,9,1,1,6,7,1,1,4,8,5,7,2,5))


Je vous remercie par avance.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Moyenner des données selon 2 colonnes et certaines lignes

Messagepar Pierre-Yves Berrard » 28 Juil 2022, 08:49

Bonjour,

Une proposition en utilisant le package dplyr :

Code : Tout sélectionner

library(dplyr)

donnees %>%
  group_by(voie, time) %>%
  slice_tail(n = 2) %>%
  summarise(
    moy = mean(Temp, na.rm = TRUE),
    .groups = "drop"
  )


PS : aggregate renvoie un data.frame donc pas besoin d'utiliser do.call dans votre code initial :

Code : Tout sélectionner

mean_donnees <-
  aggregate(
    donnees[4],
    by = donnees[c("voie", "time")],
    FUN = function(x) mean(x, na.rm = TRUE)
  )
PY

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Moyenner des données selon 2 colonnes et certaines lignes

Messagepar Mickael Canouil » 28 Juil 2022, 09:24

La version {data.table}

Code : Tout sélectionner

library(data.table)
setDT(donnees)[
  
= list(
    
moy mean(tail(Temp2L), na.rm TRUE)
  ),
  
by c("voie""time")
Mickaël
mickael.canouil.fr | rlille.fr

Guilhem Freche
Messages : 11
Enregistré le : 01 Avr 2020, 08:45

Re: Moyenner des données selon 2 colonnes et certaines lignes

Messagepar Guilhem Freche » 28 Juil 2022, 09:46

Bonjour,
merci pour ces solutions qui fonctionnent avec "tail". En fait, je souhaiterais ne pas récupérer la dernière ligne mais les 2 précédentes.
Je n'arrive pas à trouver la bonne combinaison .

De plus dans le data.frame obtenu j'aimerais ajouter la colonne timestamp avec cette fois la première valeur. Par exemple :

pour la ligne B_1 100 6.5
il faudrait avoir le timestamp 2022-01-03 03:10:00 sur la première colonne.

J'imagine que cet assez évident pour vous, pour le moment je n'ai pas les bons reflex ou logique.
Encore merci à vous

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Moyenner des données selon 2 colonnes et certaines lignes

Messagepar Pierre-Yves Berrard » 28 Juil 2022, 10:37

Pour récupérer l'antépénultième et pénultième éléments d'un vecteur :

Code : Tout sélectionner

v <- 1:10

tail(head(v, -1), 2)

ce qui équivaut en utilisant le %>%

Code : Tout sélectionner

v %>% head(-1) %>% tail(2)
PY

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Moyenner des données selon 2 colonnes et certaines lignes

Messagepar Pierre-Yves Berrard » 28 Juil 2022, 10:42

On pourrait donc adapter le code dplyr de cette façon :

Code : Tout sélectionner

donnees %>%
  group_by(voie, time) %>%
  summarise(
    moy = mean(tail(head(Temp, -1), 2), na.rm = TRUE),
    timestamp1 = head(timestamp, 1),
    .groups = "drop"
  )
PY

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Moyenner des données selon 2 colonnes et certaines lignes

Messagepar Mickael Canouil » 28 Juil 2022, 11:51

Quel est le résultat attendu quand il n'y a pas trois observations ?
Par exemple, au temps 0.

Ci dessous une approche alternative à celle de Pierr-yves, ne donnant pas le même type de résultat selon le vecteur en entrée.

Code : Tout sélectionner

<- 1:10
head
(tail(v3), 2)
#> [1] 8 9
tail(head(v, -1), 2)
#> [1] 8 9

<- 9:10
head
(tail(v3), 2)
#> [1]  9 10
tail(head(v, -1), 2)
#> [1] 9

<- 10
head
(tail(v3), 2)
#> [1] 10
tail(head(v, -1), 2)
#> numeric(0) 
Mickaël
mickael.canouil.fr | rlille.fr

Guilhem Freche
Messages : 11
Enregistré le : 01 Avr 2020, 08:45

Re: Moyenner des données selon 2 colonnes et certaines lignes

Messagepar Guilhem Freche » 28 Juil 2022, 16:28

Lors qu'il n'y a pas 3 observations, on ne doit pas créer de ligne moyenne.
Merci pour vos retours, je commence à mieux comprendre ces fonctions. Ce que vous m'avez proposé correspond à ce que je souhaitais faire et de manière efficace.


Retourner vers « Questions en cours »

Qui est en ligne

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