Dans mon code ci-dessous, je voudrais trouver le cumsum code> pour chaque année. En ce moment,
variable A code> est en train d'être
sommée code> pour toute la durée. Toute aide serait appréciée.
library(dplyr)
library(lubridate)
set.seed(50)
DF <- data.frame(date = seq(as.Date("2001-01-01"), to= as.Date("2003-12-31"), by="day"),
A = runif(1095, 0,10))
DF1 <- DF %>%
mutate(Year = year(date), Month = month(date), JDay = yday(date)) %>%
filter(between(Month,5,10)) %>%
group_by(Year, JDay) %>%
mutate(Precipitation = cumsum(A))
3 Réponses :
Il suffit de supprimer Jday code> à partir de variables de regroupement
J'ai supprimé mon commentaire précédent ... J'ai eu quelques autres paquets ( Tidyverse Code>,
TidyR CODE>), car je crois que je crois que la seule raison de ne pas avoir la bonne réponse.
Il semble que le problème ici est avec votre clause de regroupement. Spécifiquement, comme il existe autant de combinaisons distinctes de an code> et
JDAD code> dans vos données car il existe des lignes dans
DF code>, le
cumsum suivant Code> Fonctionnement à l'intérieur
Mutate CODE> renvoie simplement la même valeur que la colonne d'entrée,
A code>. Je crois que ce qui suit devrait vous donner ce que vous êtes après
J'ai mis à jour ma réponse pour montrer que le code produit en effet un cadre de données dans lequel précipitations code> représente la valeur cumulative de
A code> pour chaque année code>. Si la sortie n'est pas ce que vous êtes après, pourriez-vous vous fournir un reprex qui montre ce que vous vous attendez à obtenir?
J'ai redémarré ma session R et charger uniquement lubridate code> et
dplyr code> packages et il a commencé à fonctionner. Auparavant, j'ai eu le
Tidyverse code>,
titsy code> des paquets chargés également. Je ne sais pas pourquoi, mais je pense qu'il pourrait y avoir une sorte de confusion parmi les paquets, c'est pourquoi je ne recevais pas la bonne réponse.
Voici une solution si vous Vous voulez le Cumsum pour les mois 5-10 seulement, vous mettriez le filtre avant de calculer le Cumsum: P> data.Table code> de la carte. Si vous voulez le Cumsum pour chaque année, mais ne montrez que l'intervalle du mois 5 à 10, ce serait
datable.table code> code pour cela:
data.table(DF)[, `:=` (Year = year(date), Month = month(date), JDay = yday(date))][between(Month, 5, 10)][, Precipitation := cumsum(A), by=Year][]
#> date A Year Month JDay Precipitation
#> 1: 2001-05-01 6.2465000 2001 5 121 6.246500
#> 2: 2001-05-02 0.1877191 2001 5 122 6.434219
#> 3: 2001-05-03 5.3717570 2001 5 123 11.805976
#> 4: 2001-05-04 5.5457454 2001 5 124 17.351722
#> 5: 2001-05-05 5.1508288 2001 5 125 22.502550
#> ---
#> 548: 2003-10-27 0.1979292 2003 10 300 916.597973
#> 549: 2003-10-28 6.7286553 2003 10 301 923.326629
#> 550: 2003-10-29 8.7215420 2003 10 302 932.048171
#> 551: 2003-10-30 8.2572257 2003 10 303 940.305396
#> 552: 2003-10-31 9.6567923 2003 10 304 949.962189