[Résolu] Somme glissante

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

murielle lethrosne
Messages : 10
Enregistré le : 24 Juin 2015, 07:53

[Résolu] Somme glissante

Messagepar murielle lethrosne » 24 Juin 2015, 08:52

Bonjour,

Je me lance à exposer mon problème:

J'ai un jeu de données trimestrielles:

Code : Tout sélectionner

>tab
Année    Trimestre       val
2010     20101      631
2010     20102      452
2010     20103      526
2010     20104      636
2011     20111      658
2011     20112      755
2011     20113      794
2011     20114      659
...


La 2ème colonne correspond à l'année concaténée avec le numéro de trimestre (ex: 20113 correspond au 3ème trimestre 2011)
Je cherche à obtenir une série glissante (annuelle-somme des 4trimestres précédents).
Donc à avoir:

Code : Tout sélectionner

>
Année_glissante      Trimestre       val_glissante
2010     20101      
2010     20102      
2010     20103      
2010     20104      2245
2011     20111      2272
2011     20112      2575
2011     20113      2843
2011     20114      2866
...

Ce que j'avais trouvé comme piste, était la fonction stat.slide du package pastecs.

Code : Tout sélectionner

>stat.slide(1:20,tab$val,basic=TRUE,delta=4)
         [1,5[ [5,9[ [9,13[ [13,17[ [17,21[
xmin         1     5      9      13      17
xmax         5     9     13      17      21
nbr.val      4     4      4       4       4
nbr.null     0     0      0       0       0
nbr.na       0     0      0       0       0
min        452   658    395     311     247
max        636   794    756     563     497
range      184   136    361     252     250
sum       2245  2866   2341    1771    1479


ça me permet bien de définir mon pas de 4, par contre les blocs/sommes ne se superposent pas.
J'aurais voulu [1,5[ [2,6[ [3,7[...etc etc

Mis à part construire moi même une boucle/fonction pour pouvoir l'appliquer à l'ensemble de mes tableaux/colonnes, connaissez vous une fonction existante?
Déjà un grand merci d'avoir pris le temps de lire mon problème.
Murielle

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Somme glissante

Messagepar Gabriel Terraz » 24 Juin 2015, 09:19

Salut,

Si je ne me trompe pas, tu as la fonction rollapply du package "zoo" :

Code : Tout sélectionner

set.seed(1)
y <- rnorm(15)
rollapply(y , 4 , sum)
 [1]  0.3168417  1.2728033  0.2686916  1.5917492  0.7347931  0.9810667  1.4961467  2.5204988  2.1720174  0.9749954 -0.9343161
[12] -1.3211663


Et sans package :

Code : Tout sélectionner

mapply(function(X,Y) sum(y[X:Y]) ,1:(length(y)-3) , 4:length(y))
 [1]  0.3168417  1.2728033  0.2686916  1.5917492  0.7347931  0.9810667  1.4961467  2.5204988  2.1720174  0.9749954 -0.9343161
[12] -1.3211663


Vérification :

Code : Tout sélectionner

sum(y[1:4])
[1] 0.3168417
sum(y[2:5])
[1] 1.272803

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

Re: Somme glissante

Messagepar Serge Rapenne » 24 Juin 2015, 09:22

Bonjour,

tu devrais trouver ton bonheur grâce à la fonction rollapply du package "zoo":

Code : Tout sélectionner

 dta
  Année Trimestre val
1  2010     20101 631
2  2010     20102 452
3  2010     20103 526
4  2010     20104 636
5  2011     20111 658
6  2011     20112 755
7  2011     20113 794
8  2011     20114 659

somme_glis<-rollapply(dta$val,4,sum)
somme_glis<-c(rep(NA,3),somme_glis)

dta<-cbind(dta,somme_glis)
> dta
  Année Trimestre val somme_glis
1  2010     20101 631         NA
2  2010     20102 452         NA
3  2010     20103 526         NA
4  2010     20104 636       2245
5  2011     20111 658       2272
6  2011     20112 755       2575
7  2011     20113 794       2843
8  2011     20114 659       2866


Serge

EDIT : Grillé

murielle lethrosne
Messages : 10
Enregistré le : 24 Juin 2015, 07:53

Re: Somme glissante

Messagepar murielle lethrosne » 24 Juin 2015, 09:28

Merci Gabriel, c'est exactement ce que je cherchais!


Retourner vers « Questions en cours »

Qui est en ligne

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

cron