Calcular sum acumulativa dentro de cada ID (grupo)

Con dataframe:

df <- data.frame(id = rep(1:3, each = 5) , hour = rep(1:5, 3) , value = sample(1:15)) 

Quiero agregar una columna de sum acumulativa que coincida con la id :

 df id hour value csum 1 1 1 7 7 2 1 2 9 16 3 1 3 15 31 4 1 4 11 42 5 1 5 14 56 6 2 1 10 10 7 2 2 2 12 8 2 3 5 17 9 2 4 6 23 10 2 5 4 27 11 3 1 1 1 12 3 2 13 14 13 3 3 8 22 14 3 4 3 25 15 3 5 12 37 

¿Cómo puedo hacer esto de manera eficiente? ¡Gracias!

 df$csum <- ave(df$value, df$id, FUN=cumsum) 

Para agregar a las alternativas, la syntax de data.table es agradable:

 library(data.table) DT <- data.table(df, key = "id") DT[, csum := cumsum(value), by = key(DT)] 

O, más compacto:

 library(data.table) setDT(df)[, csum := cumsum(value), id][] 

Lo anterior:

  • Convierta el data.frame a un data.table por referencia
  • Calcule la sum acumulativa del valor agrupado por id y asígnelo por referencia
  • Imprime (el último [] allí) el resultado de toda la operación

"df" ahora será una data.table con una columna "csum".

Usando la biblioteca plyr .

 library(plyr) ddply(df,.(id),transform,csum=cumsum(value)) 

Usando dplyr ::

 require(dplyr) df %>% group_by(id) %>% mutate(csum = cumsum(value)) 
    Intereting Posts