The ave solution could be written as:

transform(mydf1, yearly_sum = ave(daily_mean, cut(Data, "year"), FUN = cumsum))

On Mon, Aug 10, 2026 at 6:43 AM Eric Berger <[email protected]> wrote:
>
> I asked ChatGPT (5.5 Medium). Here is its analysis
>
> The problem is not Feb. 29 itself. The problem is that aggregate()
> changes its return structure depending on whether all groups have the
> same length.
> In your first version, years have different numbers of days: most have
> 365, leap years have 366. So aggregate(...)
> returns a grouped result where each year’s cumsum() is kept as a list element.
> Then this works by accident:
> unlist(...[2], use.names = FALSE)
> because it flattens the list year by year.
> But after you remove Feb. 29, every year has exactly 365 rows. Now
> aggregate() sees that every cumsum() result has the same length, so it
> “simplifies” the result into a matrix-like structure. When you then
> unlist() it, the values are no longer flattened in the chronological
> order you expect.
> The clean fix is: do not use aggregate() for this. Use ave().
>
> mydf1 <- data.frame(
>   Data = seq(
>     as.POSIXct("2003-01-01", format = "%Y-%m-%d", tz = "Etc/GMT-1"),
>     as.POSIXct("2023-12-31", format = "%Y-%m-%d", tz = "Etc/GMT-1"),
>     by = "1 day"
>   ),
>   daily_mean = round(runif(7670, 0, 2), digits = 2)
> )
>
> mydf1 <- mydf1[format(mydf1$Data, "%m-%d") != "02-29", ]
>
> mydf1$yearly_sum <- ave(
>   mydf1$daily_mean,
>   as.integer(format(mydf1$Data, "%Y")),
>   FUN = cumsum
> )
>
> You can also force your original aggregate() approach to behave more
> consistently by adding simplify = FALSE:
>
> tmp <- aggregate(
>   daily_mean ~ as.integer(format(mydf1$Data, "%Y")),
>   data = mydf1,
>   FUN = cumsum,
>   simplify = FALSE
> )
>
> mydf1$yearly_sum <- unlist(tmp$daily_mean, use.names = FALSE)
>
>
>
>
>
>
>
> On Mon, Aug 10, 2026 at 1:07 PM Stefano Sofia via R-help
> <[email protected]> wrote:
> >
> > Dear R-list users,
> >
> > I've got problems to use the function aggregate.
> >
> >
> > Here there is an example:
> >
> >
> > mydf <- data.frame(Data=seq(as.POSIXct("2003-01-01", format = "%Y-%m-%d", 
> > tz="Etc/GMT-1"), as.POSIXct("2023-12-31", format = "%Y-%m-%d", 
> > tz="Etc/GMT-1"), by="1 day"), daily_mean = round(runif(7670, 0, 2), 
> > digits=2))
> >
> > mydf$yearly_sum <- unlist(aggregate(daily_mean~as.integer(format(mydf$Data, 
> > "%Y")), data=mydf, cumsum)[2], use.names = FALSE)
> >
> >
> > The column "yearly_sum" is the sum of the column "daily_mean" with a reset 
> > at the beginning of each year.
> >
> > If for my analysis I want to remove the 29th of February, "yearly_sum" does 
> > not work anymore:
> >
> >
> > mydf1 <- data.frame(Data=seq(as.POSIXct("2003-01-01", format = "%Y-%m-%d", 
> > tz="Etc/GMT-1"), as.POSIXct("2023-12-31", format = "%Y-%m-%d", 
> > tz="Etc/GMT-1"), by="1 day"), daily_mean = round(runif(7670, 0, 2), 
> > digits=2))
> >
> > mydf1 <- mydf1[format(mydf1$Data, "%m-%d") != "02-29", ]
> >
> > mydf1$yearly_sum <- 
> > unlist(aggregate(daily_mean~as.integer(format(mydf1$Data, "%Y")), 
> > data=mydf1, cumsum)[2], use.names = FALSE)
> >
> >
> > In this case the column "yearly_sum" does not sum the values, and honestly 
> > I do not understand what is happening. Why?
> >
> > Could somebody help me? I already spent a big amount of hours with no 
> > success.
> >
> >
> > Thank you for your attention and you help
> >
> > Stefano
> >
> >
> >
> >
> >          (oo)
> > --oOO--( )--OOo--------------------------------------
> > Stefano Sofia MSc, PhD
> > Civil Protection Department - Marche Region - Italy
> > Meteo Section
> > Snow Section
> > Via Colle Ameno 5
> > 60126 Torrette di Ancona, Ancona (AN)
> > Uff: +39 071 806 7743
> > E-mail: [email protected]
> > ---Oo---------oO----------------------------------------
> >
> > ________________________________
> >
> > AVVISO IMPORTANTE: Questo messaggio di posta elettronica può contenere 
> > informazioni confidenziali, pertanto è destinato solo a persone autorizzate 
> > alla ricezione. I messaggi di posta elettronica per i client di Regione 
> > Marche possono contenere informazioni confidenziali e con privilegi legali. 
> > Se non si è il destinatario specificato, non leggere, copiare, inoltrare o 
> > archiviare questo messaggio. Se si è ricevuto questo messaggio per errore, 
> > inoltrarlo al mittente ed eliminarlo completamente dal sistema del proprio 
> > computer. Ai sensi dell'art. Ai sensi dell'art. 2.4 dell'allegato 1 alla 
> > DGR n. 74/2021, si segnala che, in caso di necessità ed urgenza, la 
> > risposta al presente messaggio di posta elettronica può essere visionata da 
> > persone estranee al destinatario.
> > IMPORTANT NOTICE: This e-mail message is intended to be received only by 
> > persons entitled to receive the confidential information it may contain. 
> > E-mail messages to clients of Regione Marche may contain information that 
> > is confidential and legally privileged. Please do not read, copy, forward, 
> > or store this message unless you are an intended recipient of it. If you 
> > have received this message in error, please forward it to the sender and 
> > delete it completely from your computer system.
> >
> >         [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > [email protected] mailing list -- To UNSUBSCRIBE and more, see
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide 
> > https://www.R-project.org/posting-guide.html
> > and provide commented, minimal, self-contained, reproducible code.
>
> ______________________________________________
> [email protected] mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



-- 
Statistics & Software Consulting
GKX Group, GKX Associates Inc.
tel: 1-877-GKX-GROUP
email: ggrothendieck at gmail.com

______________________________________________
[email protected] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to