Boucle for et cbind

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

namaa ghassan
Messages : 27
Enregistré le : 15 Déc 2016, 15:56

Boucle for et cbind

Messagepar namaa ghassan » 28 Fév 2017, 13:51

Bonjour Jeunes Gens :)

J'ai un petit problème d'affichage des résultats d'une boucle for !!

Un petit aperçu sur mes données : Ma base contient 4 codes et chacun d'eux est étalé sur 366 jours donc au total j'ai 1464 lignes !!! en plus des codes et des dates !!! j'ai deux colonnes une des prix et l'autre des quantités !!

Code : Tout sélectionner

> str(tabsum)
'data.frame':   1464 obs. of  5 variables:
 $ CodeFam: Factor w/ 4 levels "350","360","380",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ DateT  : Factor w/ 366 levels "2015-10-01","2015-10-02",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Qte    : int  15 12 9 7 9 11 16 23 12 23 ...
 $ PrixDev: int  10220 8800 5160 4235 3575 6540 11690 12015 6805 16897 ...
 $ Prix   : num  681 733 573 605 397 595 731 522 567 735 ...
>



Donc en partant de ce code, je voulais calculer la moyenne des quantités et des prix sur 28 jours glissants pour chaque code !!!! jusqu'à mtn tout va bien !! mais le problème se situe dans la matrice "rslt" !! vu qu'à la fin ça me fait sortir pour chaque code les moyennes du dernier code !!!
alors que moi j'ai envie qu'il me sorte pour chaque code les moyennes qui lui correspond !!

Code : Tout sélectionner

MQ <- NULL
MP <- NULL
rslt <- NULL

for(cf in unique(tabsum[,1])){
    quanti <- tabsum[tabsum[,1]==cf , 3]
         price <- tabsum[tabsum[,1]==cf , 5]
         for (i in (29:length(price)) ) {
      Qt <- quanti[(i-28):(i-1)]      
      Px <- price[(i-28):(i-1)]
      MQ[(i):(i)] <- round(mean(Qt),2)
      MP[(i):(i)] <- round(mean(Px),2)   
   }
   rslt <- cbind(tabsum$CodeFam, tabsum$DateT, tabsum$Qte, tabsum$PrixDev, tabsum$Prix,  MP ,MQ)   
   rslt <- as.data.frame(rslt)
}


D'avance merciiiiiii.
SI vous avez besoin d'autres infos je suis là :)

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Boucle for et cbind

Messagepar Logez Maxime » 28 Fév 2017, 15:11

Bonjour,

Tu peux utiliser la fonction rollmean du package zoo combiné avec le package dplyr :

Code : Tout sélectionner

library(zoo)
library(dplyr)
tabsum %>% group_by(CodeFam) %>% do(cbind(.[-(1:27),], MQ = rollmean(.$Qte, 28), MP = rollmean(.$Prix, 28)))
Mais je ne sais pas si c'est intéressant de conserver les informations de prix et Qte, si oui tu peux faire :

Code : Tout sélectionner

tab %>% group_by(CodeFam) %>% do(cbind(., MQ = c(rep(NA, 27),rollmean(.$Qte, 28)), MP = c(rep(NA,27),rollmean(.$Prix, 28))))
Cordialement,
Maxime

namaa ghassan
Messages : 27
Enregistré le : 15 Déc 2016, 15:56

Re: Boucle for et cbind

Messagepar namaa ghassan » 28 Fév 2017, 15:16

Merciiiiiiiiiiiii Maxime
Cdt,


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité