Programación funcional eficiente (usando mapply) en R para un problema de procedimiento "naturalmente"

Un caso de uso común en R (al menos para mí) es identificar observaciones en un marco de datos que tienen alguna característica que depende de los valores en algún subconjunto de otras observaciones.

Para que esto sea más incómodo, supongamos que tengo varios trabajadores (indexados por WorkerId) que tienen una "iteración" asociada:

    raw <- data.frame(WorkerId=c(1,1,1,1,2,2,2,2,3,3,3,3),
              Iteration = c(1,2,3,4,1,2,3,4,1,2,3,4))

y finalmente quiero subconjugar el marco de datos para excluir la "última" iteración (creando un booleano "eliminar") para cada trabajador. Puedo escribir una función para hacer esto:

raw$remove <- mapply(function(wid,iter){
                              iter==max(raw$Iteration[raw$WorkerId==wid])},
                 raw$WorkerId, raw$Iteration)

> raw$remove
  [1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE

pero esto se vuelve muy lento a medida que el marco de datos se hace más grande (presumiblemente porque estoy calculando innecesariamente el máximo para cada observación).

Mi pregunta es cuál es la forma más eficiente (e idiomática) de hacer esto en el estilo de programación funcional. ¿Se trata primero de crear un diccionario de valores WorkerId to Max y luego usarlo como parámetro en otra función que opera en cada observación?

Respuestas a la pregunta(5)

Su respuesta a la pregunta