Synthétiser trois variables d'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

pierre-jean valente
Messages : 2
Enregistré le : 07 Nov 2021, 15:15

Synthétiser trois variables d'un data frame

Messagepar pierre-jean valente » 09 Nov 2021, 19:17

Bonjour,

Peu expérimenté sous R, je cherche à synthétiser 3 variables issues d'un data.frame.
La manipulation est faisable en 3 clics sous Excel (même si la comparaison ne tient pas, je vous l'accorde), je pense donc avoir mal formulé ma recherche sur les moteurs de recherche car je ne trouve pas de solution à mon problème.

Je dispose de prix de carburants, issus de l'open-data :

Code : Tout sélectionner

x.id         nom      id                 maj          valeur
44450003      SP98     6    2021-11-06 11:28:14    1.729
44450003      SP95     2    2021-11-06 11:28:14     1.689
44450003       Gazole     1    2021-11-06 11:28:13     1.559
44290001      SP98     6   2021-11-06 09:00:00     1.729
44290001      SP95     2    2021-11-06 09:00:00     1.689
44290001       Gazole     1    2021-11-06 09:00:00     1.519


Je souhaiterai maintenant pivoter ces données pour avoir en ligne les x.id (identifiant de station), en colonne le champ Nom correspondant au type de carburant, et en aggrégat, la moyenne du champ "valeur". Quelque chose qui ressemblerait à cela en résumé :

Code : Tout sélectionner

x.id      SP95      SP95      Gazole
44450003   1.729   1.689   1.559
44290001   1.729   1.689   1.519


Le package pivottableR me paraissait idéal, mais le code suivant me renvoie une erreur :
pivot_prix <- PivotTable$new()
pivot_prix$addData(prix_carburants_instant)
pivot_prix$addColumnDataGroups("nom")
pivot_prix$addRowDataGroups("x.id")
pivot_prix$defineCalculation(calculationName = "PrixMoyen", caption = "Prix moyen", summariseExpression = "mean(valeur, na.rm=TRUE")
pivot_prix$evaluatePivot()

Error in parse(text = summaryCmd) : <text>:2:0: unexpected end of input
1: data <- dplyr::summarise(data, calc000001 = mean(valeur, na.rm=TRUE)
^

Merci pour vos conseils :)

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

Re: Synthétiser trois variables d'un data frame

Messagepar Pierre-Yves Berrard » 09 Nov 2021, 20:55

Bonjour,

Code : Tout sélectionner

library(tidyr)

pivot_wider(
  data        = prix_carburants_instant,
  id_cols     = x.id,
  names_from  = nom,
  values_from = valeur,
  values_fn   = mean
)
PY

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

Re: Synthétiser trois variables d'un data frame

Messagepar Serge Rapenne » 09 Nov 2021, 22:21

ou , juste pour provoquer Mickaël,

Code : Tout sélectionner

library(dplyr)
library(tidyr)

prix_carburants_instant %>% pivot_wider(
    id_cols     = x.id,
  names_from  = nom,
  values_from = valeur,
  values_fn   = mean
)


parfois mon mauvais fond ressort ;-)

Serge

pierre-jean valente
Messages : 2
Enregistré le : 07 Nov 2021, 15:15

Re: Synthétiser trois variables d'un data frame

Messagepar pierre-jean valente » 10 Nov 2021, 06:06

Merci pour vos retours, c'est parfait et plutôt simple en effet !

Bonne journée

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

Re: Synthétiser trois variables d'un data frame

Messagepar Mickael Canouil » 10 Nov 2021, 08:56

Hum , on me cherche ^^

D'abord une "vraie" alternative

Code : Tout sélectionner

library("data.table")

df <- structure(list(x.id = c(44450003L, 44450003L, 44450003L, 44290001L, 
44290001L
, 44290001L), nom = c("SP98", "SP95", "Gazole", "SP98",
"SP95", "Gazole"), id = c(6L, 2L, 1L, 6L, 2L, 1L), maj = c("2021-11-06 11:28:14",
"2021-11-06 11:28:14", "2021-11-06 11:28:13", "2021-11-06 09:00:00",
"2021-11-06 09:00:00", "2021-11-06 09:00:00"), valeur = c(1.729,
1.689, 1.559, 1.729, 1.689, 1.519)), class = "data.frame", row.names = c(NA,
-
6L))

dcast(setDT(df), x.id ~ nom, fun.aggregate = mean, value.var = "valeur")
#>        x.id Gazole  SP95  SP98
#> 1: 44290001  1.519 1.689 1.729
#> 2: 44450003  1.559 1.689 1.729  


Ensuite une réponse à Serge : Le présent c'est ça ;p
Serge Rapenne a écrit :ou , juste pour provoquer Mickaël

Code : Tout sélectionner

library("data.table")
df |>
  setDT() |>
  (\(x) dcast(x, x.id ~ nom, fun.aggregate = mean, value.var = "valeur"))()
#>        x.id Gazole  SP95  SP98
#> 1: 44290001  1.519 1.689 1.729
#> 2: 44450003  1.559 1.689 1.729  
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

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