r max groupwise-maximum

Encontrar el máximo de ejecución por grupo



max groupwise-maximum (2)

Necesito encontrar un máximo de una variable por grupo usando R. La variable se ordena por tiempo dentro del grupo usando df[order(df$group, df$time),] .

Mi variable tiene algunos NA, pero puedo manejarlo reemplazándolos con ceros para este cálculo.

así es como se ve el marco de datos df:

(df <- structure(list(var = c(5L, 2L, 3L, 4L, 0L, 3L, 6L, 4L, 8L, 4L), group = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), .Label = c("a", "b"), class = "factor"), time = c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L)), .Names = c("var", "group","time"), class = "data.frame", row.names = c(NA, -10L))) # var group time # 1 5 a 1 # 2 2 a 2 # 3 3 a 3 # 4 4 a 4 # 5 0 a 5 # 6 3 b 1 # 7 6 b 2 # 8 4 b 3 # 9 8 b 4 # 10 4 b 5

Y quiero una variable curMax como:

var | group | time | curMax 5 a 1 5 2 a 2 5 3 a 3 5 4 a 4 5 0 a 5 5 3 b 1 3 6 b 2 6 4 b 3 6 8 b 4 8 4 b 5 8

Avíseme si tiene alguna idea de cómo implementarlo en R.


Podemos probar data.table . Convierta el ''data.frame'' a ''data.table'' ( setDT(df1) ), agrupado por ''group'', obtenemos el cummax de ''var'' y lo asignamos ( := ) a una nueva variable (''curMax'')

library(data.table) setDT(df1)[, curMax := cummax(var), by = group]

Como comentó @Michael Chirico, si los datos no están order por ''hora'', podemos hacerlo en la ''i''

setDT(df1)[order(time), curMax:=cummax(var), by = group]

O con dplyr

library(dplyr) df1 %>% group_by(group) %>% mutate(curMax = cummax(var))

Si df1 es tbl_sql puede ser necesario realizar un pedido explícito, utilizando arrange

df1 %>% group_by(group) %>% arrange(time, .by_group=TRUE) %>% mutate(curMax = cummax(var))

o dbplyr::window_order

library(dbplyr) df1 %>% group_by(group) %>% window_order(time) %>% mutate(curMax = cummax(var))


puedes hacerlo así:

df$curMax <- ave(df$var, df$group, FUN=cummax)