2017-04-20 1 views
1

données:cumsum dans un XTS pour les valeurs qui résument déjà, mais remis à zéro chaque année

 [,1] 
2015-03-17 1 
2015-03-18 2 
2015-03-19 4 
{cont} 
2015-12-31 200 
2016-01-01 0 
2016-12-02 3 
2016-12-03 9 

Depuis cette XTS a déjà le total en cours d'exécution dans les années, je voulais calculer le total des années accross en cours d'exécution.

Il ressemble

  Value ## cumsum(value) ## not what I want 
2015-03-17 1  # 1 
2015-03-18 2  # 3 
2015-03-19 4  # 7 
{cont}    # {cont} 
2015-12-31 200  # x, where x is much bigger than 200 
2016-01-01 200  # x + x 
2016-01-02 203  # 3x + 3 
2016-12-03 209  # 4x + 3 + 9 

J'ai essayé d'utiliser cumsum et mutate, mais il est revenu total et n'a pas changé depuis des années en cours d'exécution.

+0

Je ne comprends pas votre question. Vos données ont un total cumulé qui commence à zéro au début de chaque année civile. Vous voulez que le total cumulé soit réparti sur toute la période, ce que fait 'cumsum (x)'. Mais vous dites que cela ne fonctionne pas parce que, "il a retourné le total cumulatif et n'a pas changé pendant des années", ce qui ressemble exactement à ce que vous avez dit que vous vouliez. –

+0

Peut-être que j'utilise 'cumsum' mal, mais il garde un total cumulé, alors que je veux juste le total de 2015 (la valeur fournie le 12/31) ajouté à chaque valeur en 2016 –

+0

Ah, je pense que je comprends. Par exemple, vous voudriez que c (0: 5, 0: 5) 'devienne' c (0: 5, 0: 5 + 5) '. –

Répondre

0

Maintenant que je comprends votre question, voici une solution. Les commentaires expliquent, espérons-le, ce qui se fait.

# Merge original data with year-end values, filling with zeros 
y <- merge(x, year.end = apply.yearly(x, last), fill = 0) 

# Lag year-end values, so they appear at the start of the following year 
y$year.end <- lag(y$year.end) 

# Set first NA to zero (so cumsum results aren't all NA) 
y$year.end[1] <- 0 

# Take a cumulative sum of the year-end values, so they increase each year 
y$year.end <- cumsum(y$year.end) 

# Add two columns to create running total 
y$running.total <- rowSums(y)